.
variable: Rope.ROPE;
IF in.PeekChar[] = '0
THEN {
[] ← in.GetChar[]; -- toss it (assumes that we can strip a leading zero)
[]← in.SkipWhitespace[];
IF in.EndOf[] THEN RETURN[ZeroDPoly];
char ← in.PeekChar[];
IF char = '$ THEN RETURN[ZeroDPoly, in.GetChar[] ];
IF termCharProc[char] THEN RETURN[ZeroDPoly, char];
};
DO
Initialization
legalTermStartSeen ← FALSE;
sign ← 1;
coeff ← one; -- default term is +1
degreeVec ← NIL;
Look for (optional) sign preceding first term, or (mandatory) sign separating two terms
[]← in.SkipWhitespace[];
IF in.PeekChar[] = '-
THEN {
sign ← -1;
[] ← in.GetChar[]; -- toss it
[]← in.SkipWhitespace[];
}
ELSE IF in.PeekChar[] = '+
THEN {
[] ← in.GetChar[]; -- toss it
[]← in.SkipWhitespace[];
}
ELSE IF NOT firstTerm THEN ERROR;
firstTerm ← FALSE;
Look for (optional) coefficient [Cannot be at EndOf[in] here]
IF coeffRing.class.legalFirstChar[in.PeekChar[], coeffRing]
THEN {
legalTermStartSeen ← TRUE;
coeff ← coeffRing.class.read[in, coeffRing];
[]← in.SkipWhitespace[];
IF coeffRing.class.equal[coeff, coeffRing.class.zero[coeffRing]] THEN ERROR ReadDPFail[$ZeroCoefficient]; -- zero coeff not allowed
IF NOT in.EndOf[]
AND in.PeekChar[]='*
THEN {
[] ← in.GetChar[]; -- toss * multiplication
[]← in.SkipWhitespace[];
};
};
IF sign < 1 THEN coeff ← coeffRing.class.negate[coeff]; -- if sign < 1, then negate either coeff read or default coeff of 1
Look for (optional) monomial [Can be at EndOf[in] here]
WHILE NOT in.EndOf[]
AND Ascii.Letter[in.PeekChar[]]
DO
legalTermStartSeen ← TRUE;
exponent ← 1;
variable ← in.GetID[];
varIndex ← VARS.VariableIndex[variable, V];
IF varIndex = 0 THEN ERROR ReadDPFail[$UnknownVariable];
[]← in.SkipWhitespace[];
IF NOT in.EndOf[]
THEN IF in.PeekChar[] = '*
OR in.PeekChar[] = '^
THEN {
char ← in.GetChar[]; -- toss (could be either * multiplication, first char of ** exponentiation, or ^ exponentiation, here)
[]← in.SkipWhitespace[];
};
IF in.PeekChar[] = '*
OR char = '^
THEN {
-- allow ** or ^ exponentiation
IF in.PeekChar[] = '* THEN [] ← in.GetChar[]; -- toss
[]← in.SkipWhitespace[];
SELECT in.PeekChar[]
FROM
IN ['0..'9] => {
exponent ← in.GetCard;
[]← in.SkipWhitespace[];
IF exponent = 0 THEN ERROR ReadDPFail[$ZeroExponent];
};
ENDCASE=> ERROR ReadDPFail[$NonNumericExponent];
};
[ok, degreeVec] ← DVInsertVariablePower[varIndex, exponent, degreeVec];
IF NOT ok THEN ERROR ReadDPFail[$RepeatedVariable];
ENDLOOP;
Check that we saw some kind of legal term
IF legalTermStartSeen
THEN {
[ok, poly] ← DPInsertTerm[coeff, degreeVec, poly];
IF NOT ok THEN ERROR ReadDPFail[$RepeatedMonomial];
}
ELSE ERROR ReadDPFail[$UnexpectedCharacter];
IF in.EndOf[] THEN RETURN[poly];
char ← in.PeekChar[];
IF char = '$ THEN RETURN[poly, in.GetChar[] ];
IF termCharProc[char] THEN RETURN[poly, char ];
ENDLOOP;