Compiler/syntax analyzer: Difference between revisions

m
→‎{{header|ALGOL W}}: Avoid line-wrap
m (syntax highlighting fixup automation)
m (→‎{{header|ALGOL W}}: Avoid line-wrap)
Line 654:
 
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin % syntax analyser %
begin % syntax analyser %
% parse tree nodes %
record node( integer type
Line 952 ⟶ 953:
while begin
if tkType = tString then begin
stmtNode := opNode( nSequence, stmtNode, opNode( nPrts, operandNode( nString, tkIntegerValue ), null ) );
, stmtNode
, opNode( nPrts, operandNode( nString, tkIntegerValue ), null )
);
readToken
end
Line 981 ⟶ 985:
reference(node) listNode;
listNode := null;
while tkType not = terminator and tkType not = tEnd_of_input do listNode := opNode( nSequence, listNode, parseStatement );
and tkType not = tEnd_of_input do listNode := opNode( nSequence, listNode, parseStatement );
listNode
end parseStatementList ;
 
% sets a node code and name %
nIdentifier := 1; ndName( nIdentifier ) := "Identifier"; nString := 2; ndName( nString ) := "String";
procedure setNode ( integer result nd; integer value ndCode; string(14) value name ) ;
nInteger := 3; ndName( nInteger ) := "Integer"; nSequence := 4; ndName( nSequence ) := "Sequence";
nIf begin nd := 5ndCode; ndName( nIf ndCode ) := "If"; nPrtc := 6; ndName( nPrtc ) :=name "Prtc"end;
 
nPrts := 7; ndName( nPrts ) := "Prts"; nPrti := 8; ndName( nPrti ) := "Prti";
setNode( nIdentifier, 1, "Identifier" ); setNode( nString, 2, "String" );
nWhile := 9; ndName( nWhile ) := "While"; nAssign := 10; ndName( nAssign ) := "Assign";
nNegate := 11; ndNamesetNode( nNegatenInteger, ) :=3, "NegateInteger"; ); nNotsetNode( nSequence, 4, "Sequence" := 12); ndNamesetNode( nNotnIf, 5, "If" ) := "Not";
nMultiplysetNode( nPrtc, := 13; ndName( nMultiply6, "Prtc" ) := "Multiply"); setNode( nPrts, nDivide :=7, "Prts" 14; ndName( nDivide ) := "Divide";
nMod := 15; ndNamesetNode( nModnPrti, ) :=8, "ModPrti"; ); nAddsetNode( nWhile, := 16; ndName( nAdd9, "While" ) := "Add";
nSubtractsetNode( nAssign, := 17; ndName( nSubtract10, "Assign" ) := "Subtract"; setNode( nNegate, nLess 11, "Negate" := 18); ndNamesetNode( nLess nNot, 12, "Not" ) := "Less";
nLessEqualsetNode( nMultiply, 13, :="Multiply" 19; ndName( nLessEqual ); setNode( nDivide, ) :=14, "LessEqualDivide" ; nGreater := 20); ndNamesetNode( nGreaternMod, ) :=15, "GreaterMod" );
nGreaterEqualsetNode( nAdd, := 21; ndName( nGreaterEqual ) :=16, "GreaterEqualAdd"; nEqual := 22; ndName( nEqual ); setNode( nSubtract, ) :=17, "EqualSubtract" );
nNotEqual := 23; ndNamesetNode( nNotEqualnLess, ) :=18, "NotEqualLess"; nAnd := 24); ndNamesetNode( nAnd nLessEqual, 19, "LessEqual" ) := "And";
nOr := 25; ndNamesetNode( nOr nGreater, 20, "Greater" ) := "Or";
setNode( nGreaterEqual, 21, "GreaterEqual" ); setNode( nEqual, 22, "Equal" );
setNode( nNotEqual, 23, "NotEqual" ); setNode( nAnd, 24, "And" ); setNode( nOr, 25, "Or" );
tOp_multiply := 1; tkName( tOp_multiply ) := "Op_multiply"; tkPrec( tOp_multiply ) := 5;
tOp_divide := 2; tkName( tOp_divide ) := "Op_divide"; tkPrec( tOp_divide ) := 5;
Line 1,033 ⟶ 1,040:
tkNode( tOp_multiply ) := nMultiply; tkNode( tOp_divide ) := nDivide; tkNode( tOp_mod ) := nMod;
tkNode( tOp_add ) := nAdd; tkNode( tOp_subtract ) := nSubtract; tkNode( tOp_less ) := nLess;
tkNode( tOp_lessequal ) := nLessEqual; tkNode( tOp_greater ) := nGreater; tkNode( tOp_greaterequal ) := nGreaterEqual;
tkNode( tOp_greaterequal ) := nGreaterEqual;
tkNode( tOp_equal ) := nEqual; tkNode( tOp_notequal ) := nNotEqual; tkNode( tOp_not ) := nNot;
tkNode( tOp_and ) := nAnd; tkNode( tOp_or ) := nOr;
Line 1,041 ⟶ 1,049:
readToken;
writeNode( parseStatementList( tEnd_of_input ) )
end.
end.</syntaxhighlight>
{{out}}
Output from parsing the Prime Numbers example program.
3,026

edits