|------------| |------------|
*)
-PROCEDURE BuildNot ;
+PROCEDURE BuildNot (notTokPos: CARDINAL) ;
VAR
- t, f: CARDINAL ;
+ combinedTok,
+ exprTokPos : CARDINAL ;
+ t, f : CARDINAL ;
BEGIN
CheckBooleanId ;
- PopBool (t, f) ;
- PushBool (f, t)
+ PopBooltok (t, f, exprTokPos) ;
+ combinedTok := MakeVirtualTok (notTokPos, notTokPos, exprTokPos) ;
+ PushBooltok (f, t, combinedTok)
END BuildNot ;
(*
- PopBool - Pops a True and a False exit quad number from the True/False
- stack.
+ PopBooltok - Pops a True and a False exit quad number from the True/False
+ stack.
*)
-PROCEDURE PopBool (VAR True, False: CARDINAL) ;
+PROCEDURE PopBooltok (VAR True, False: CARDINAL; VAR tokno: CARDINAL) ;
VAR
f: BoolFrame ;
BEGIN
WITH f^ DO
True := TrueExit ;
False := FalseExit ;
+ tokno := tokenno ;
Assert (BooleanOp)
END ;
DISPOSE (f)
-END PopBool ;
+END PopBooltok ;
(*
- PushBool - Push a True and a False exit quad numbers onto the
- True/False stack.
+ PushBooltok - Push a True and a False exit quad numbers onto the
+ True/False stack.
*)
-PROCEDURE PushBool (True, False: CARDINAL) ;
+PROCEDURE PushBooltok (True, False: CARDINAL; tokno: CARDINAL) ;
VAR
f: BoolFrame ;
BEGIN
- Assert(True<=NextQuad) ;
- Assert(False<=NextQuad) ;
- NEW(f) ;
+ Assert (True<=NextQuad) ;
+ Assert (False<=NextQuad) ;
+ f := newBoolFrame () ;
WITH f^ DO
TrueExit := True ;
FalseExit := False ;
BooleanOp := TRUE ;
+ tokenno := tokno ;
Annotation := NIL
END ;
PushAddress (BoolStack, f) ;
Annotate ('<q%1d>|<q%2d>||true quad|false quad')
+END PushBooltok ;
+
+
+(*
+ PopBool - Pops a True and a False exit quad number from the True/False
+ stack.
+*)
+
+PROCEDURE PopBool (VAR True, False: CARDINAL) ;
+VAR
+ tokno: CARDINAL ;
+BEGIN
+ PopBooltok (True, False, tokno)
+END PopBool ;
+
+
+(*
+ PushBool - Push a True and a False exit quad numbers onto the
+ True/False stack.
+*)
+
+PROCEDURE PushBool (True, False: CARDINAL) ;
+BEGIN
+ PushBooltok (True, False, UnknownTokenNo)
END PushBool ;
VAR
f: BoolFrame ;
BEGIN
- NEW(f) ;
+ NEW (f) ;
WITH f^ DO
TrueExit := 0 ;
FalseExit := 0 ;
WITH f^ DO
TrueExit := True
END ;
- PushAddress(BoolStack, f)
+ PushAddress (BoolStack, f)
END PushT ;
VAR
f: BoolFrame ;
BEGIN
- f := PopAddress(BoolStack) ;
+ f := PopAddress (BoolStack) ;
WITH f^ DO
True := TrueExit ;
Assert(NOT BooleanOp)
RecordOp %
=:
-ConstFactor := Number | ConstString | ConstSetOrQualidentOrFunction |
- "(" ConstExpression ")" | "NOT" ConstFactor % BuildNot %
+ConstFactor := % VAR tokpos: CARDINAL ; %
+ Number | ConstString | ConstSetOrQualidentOrFunction |
+ "(" ConstExpression ")" | "NOT" % tokpos := GetTokenNo() -1 %
+ ConstFactor % BuildNot (tokpos) %
| ConstAttribute =:
-- to help satisfy LL1
Term % BuildUnaryOp %
| Term =:
-Term := Factor { MulOperator Factor % BuildBinaryOp %
+Term := Factor
+ { MulOperator Factor % BuildBinaryOp %
} =:
-Factor := Number | string | SetOrDesignatorOrFunction |
- "(" Expression ")" | "NOT" ( Factor % BuildNot %
+Factor := % VAR tokpos: CARDINAL ; %
+ Number | string | SetOrDesignatorOrFunction |
+ "(" Expression ")" | "NOT" % tokpos := GetTokenNo ()-1 %
+ ( Factor % BuildNot (tokpos) %
| ConstAttribute
) =:
FROM M2Debug IMPORT Assert ;
FROM P2SymBuild IMPORT BuildString, BuildNumber ;
-FROM M2Quads IMPORT PushT, PopT, PushTF, PopTF, PopNothing, PushTFtok, PopTFtok, PopTtok,
+FROM M2Quads IMPORT PushT, PopT, PushTF, PopTF, PopNothing, Annotate,
+ PushTtok, PushTFtok, PopTtok, PopTFtok, OperandTok,
StartBuildDefFile, StartBuildModFile,
BuildModuleStart,
EndBuildFile,
] % PopAuto %
=:
-Relation := "=" % PushT(EqualTok) %
- | "#" % PushT(HashTok) %
- | "<>" % PushT(LessGreaterTok) %
- | "<" % PushT(LessTok) %
- | "<=" % PushT(LessEqualTok) %
- | ">" % PushT(GreaterTok) %
- | ">=" % PushT(GreaterEqualTok) %
- | "IN" % PushT(InTok) %
+Relation := "=" % PushTtok(EqualTok, GetTokenNo() -1) %
+ | "#" % PushTtok(HashTok, GetTokenNo() -1) %
+ | "<>" % PushTtok(LessGreaterTok, GetTokenNo() -1) %
+ | "<" % PushTtok(LessTok, GetTokenNo() -1) %
+ | "<=" % PushTtok(LessEqualTok, GetTokenNo() -1) %
+ | ">" % PushTtok(GreaterTok, GetTokenNo() -1) %
+ | ">=" % PushTtok(GreaterEqualTok, GetTokenNo() -1) %
+ | "IN" % PushTtok(InTok, GetTokenNo() -1) %
=:
SimpleConstExpr := UnaryOrConstTerm { AddOperator ConstTerm % BuildBinaryOp %
} =:
-UnaryOrConstTerm := "+" % PushT(PlusTok) %
+UnaryOrConstTerm := "+" % PushTtok(PlusTok, GetTokenNo() -1) %
ConstTerm % BuildUnaryOp %
|
- "-" % PushT(MinusTok) %
+ "-" % PushTtok(MinusTok, GetTokenNo() -1) %
ConstTerm % BuildUnaryOp %
|
ConstTerm =:
-AddOperator := "+" % PushT(PlusTok) ;
+AddOperator := "+" % PushTtok(PlusTok, GetTokenNo() -1) ;
RecordOp %
- | "-" % PushT(MinusTok) ;
+ | "-" % PushTtok(MinusTok, GetTokenNo() -1) ;
RecordOp %
- | "OR" % PushT(OrTok) ;
+ | "OR" % PushTtok(OrTok, GetTokenNo() -1) ;
RecordOp %
=:
ConstTerm := ConstFactor { MulOperator ConstFactor % BuildBinaryOp %
} =:
-MulOperator := "*" % PushT(TimesTok) ;
+MulOperator := "*" % PushTtok(TimesTok, GetTokenNo() -1) ;
RecordOp %
- | "/" % PushT(DivideTok) ;
+ | "/" % PushTtok(DivideTok, GetTokenNo() -1) ;
RecordOp %
- | "DIV" % PushT(DivTok) ;
+ | "DIV" % PushTtok(DivTok, GetTokenNo() -1) ;
RecordOp %
- | "MOD" % PushT(ModTok) ;
+ | "MOD" % PushTtok(ModTok, GetTokenNo() -1) ;
RecordOp %
- | "REM" % PushT(RemTok) ;
+ | "REM" % PushTtok(RemTok, GetTokenNo() -1) ;
RecordOp %
- | "AND" % PushT(AndTok) ;
+ | "AND" % PushTtok(AndTok, GetTokenNo() -1) ;
RecordOp %
- | "&" % PushT(AmbersandTok) ;
+ | "&" % PushTtok(AmbersandTok, GetTokenNo() -1) ;
RecordOp %
=:
-ConstFactor := Number | ConstString | ConstSetOrQualidentOrFunction |
- "(" ConstExpression ")" | "NOT" ConstFactor % BuildNot %
+ConstFactor := % VAR tokpos: CARDINAL ; %
+ Number | ConstString | ConstSetOrQualidentOrFunction |
+ "(" ConstExpression ")" | "NOT" % tokpos := GetTokenNo() -1 %
+ ConstFactor % BuildNot (tokpos) %
| ConstAttribute =:
-- to help satisfy LL1