; ;Module: MODULE IDENT';' [ImportList] DeclSeq [BEGIN StatementSeq] END IDENT'.' ; Module: match MODULE match IDENT match SEMICOL skipif IMPORT goto noimport gosub ImportList noimport: gosub DeclSeq skipif BEGIN goto nobody next gosub StatementSeq nobody: match END match IDENT match PERIOD return ; ;ImportList : IMPORT {IDENT [ASSIGN IDENT] / ',' } ';' ; ImportList: match IMPORT nextimport: match IDENT skipif ASSIGN goto noassign next match IDENT noassign: skipif COMMA goto importend next goto nextimport importend: match SEMICOL return ; ; DeclSeq : (CONST (IdentDef '=' ConstExpr ';')* ; | TYPE (IdentDef '=' Type ';')* | VAR (IdentList ':' Type ';')*)* ; (PROCEDURE [Receiver] IdentDef [FormalPars] ';' DeclSeq ; [BEGIN StatementSeq] END IDENT ';' ; | PROCEDURE '@' [Receiver] IdentDef [FormalPars] ';')* ; DeclSeq: skipif CONST goto testype next nextconst: skipif IDENT goto DeclSeq gosub IdentDef match EQ gosub ConstExpr match SEMICOL goto nextconst testype: skipif TYPE goto testvar next nexttype: skipif IDENT goto DeclSeq gosub IdentDef match EQ gosub Type match SEMICOL goto nexttype testvar: skipif VAR goto testproc next nextvar: skipif IDENT goto DeclSeq gosub IdentList match COLON gosub Type match SEMICOL goto nextvar testproc: skipif PROCEDURE return next skipif AT goto procdecl next skipif LPAR goto identdef gosub Receiver identdef: gosub IdentDef skipif LPAR goto testproc gosub FormalPars goto matchsemicol procdecl: skipif LPAR goto identdef1 gosub Receiver identdef1: gosub IdentDef skipif LPAR goto matchdeclseq gosub FormalPars matchdeclseq: match SEMICOL gosub DeclSeq matchsemicol: match SEMICOL goto testproc ; ; FormalPars : '(' [{[VAR] {IDENT / ','} ':' Type / ';'}] ')' [ ':' Qualident] ; FormalPars: match LPAR skipif RPAR goto fpsections endfpsections: next skipif COLON return next gosub Qualident return fpsections: skipif VAR goto idents next idents: match IDENT skipif COMMA goto matchcol next goto idents matchcol: match COLON gosub Type skipif SEMICOL goto endfpsections next goto fpsections ; ; Receiver : '(' [VAR] IDENT ':' IDENT ')' ; Receiver: match LPAR skipif VAR goto ident next ident: match IDENT match COLON match IDENT match RPAR return ; ;Type : Qualident | ARRAY '[' {ConstExpr / ','} ']' OF Type ; | RECORD ['(' Qualident ')'] {[IdentList ':' Type] / ';'} END ; | POINTER TO Type | PROCEDURE [FormalPars] ; Type: skipif IDENT goto toarray gosub Qualident return toarray: skipif ARRAY goto torecord next match LBR nextindex: gosub ConstExpr skipif COMMA goto endarray next goto nextindex endarray: match RBR match OF gosub Type return torecord: skipif RECORD goto topointer next skipif LPAR goto tofields next gosub Qualident match RPAR tofields: skipif SEMICOL goto fieldlist next goto tofields fieldlist: skipif IDENT goto recordend gosub IdentList match COLON gosub Type goto tofields recordend: match END return topointer: skipif POINTER goto toproc next match TO gosub Type return toproc: match PROCEDURE skipif LPAR return gosub FormalPars return ; ; StatementSeq : {[ Designator ASSIGN Expr ; | Designator ['(' [ExprList] ')'] ; | IF Expr THEN StatementSeq (ELSIF Expr THEN StatementSeq)* ; [ELSE StatementSeq] END ; | CASE Expr OF ; {[{ConstExpr [RANGE ConstExpr] / ','} ; ':' StatementSeq] / '|'} ; [ELSE StatementSeq] END ; | WHILE Expr DO StatementSeq END ; | REPEAT StatementSeq UNTIL Expr ; | FOR IDENT ASSIGN Expr TO Expr [BY ConstExpr] ; DO StatementSeq END ; | LOOP StatementSeq END ; | WITH Guard DO StatementSeq ('|' Guard DO StatementSeq)* ; [ELSE StatementSeq] END ; | EXIT ; | RETURN ; ] / ';'} ; StatementSeq: skipif IDENT goto if gosub Designator skipif ASSIGN goto call next gosub Expr goto endstmt call: skipif LPAR goto endstmt next skipif RPAR gosub ExprList match RPAR goto endstmt if: skipif IF goto casestmt next gosub Expr match THEN gosub StatementSeq elseif: skipif ELSEIF goto else next gosub Expr match THEN gosub StatementSeq goto elseif else: skipif ELSE goto endif next gosub StatementSeq endif: match END goto endstmt casestmt: skipif CASE goto while next gosub Expr match OF skipif ELSE goto noelse elsecase: next gosub StatementSeq matchcaseend: match END goto endstmt noelse: skipif END goto cases next goto endstmt cases: skipif ALT goto case next goto cases case: gosub ConstExpr skipif RANGE goto nextcasexpr next gosub ConstExpr nextcasexpr: skipif COMMA goto casestmts next goto case casestmts: match COLON gosub StatementSeq skipif ALT goto endcase next goto case endcase: skipif ELSE goto matchcaseend goto elsecase while: skipif WHILE goto repeat next gosub Expr match DO gosub StatementSeq match END goto endstmt repeat: skipif REPEAT goto for next gosub StatementSeq match UNTIL gosub Expr goto endstmt for: skipif FOR goto loop next match IDENT match ASSIGN gosub Expr match TO gosub Expr skipif BY goto endfor next gosub ConstExpr endfor: match DO gosub StatementSeq match END goto endstmt loop: skipif LOOP goto with next gosub StatementSeq match END goto endstmt with: skipif WITH goto exit next gosub Guard match DO gosub StatementSeq nextcase: skipif ALT goto elsewith next gosub Guard match DO gosub StatementSeq goto nextcase elsewith: skipif ELSE goto endwith next gosub StatementSeq endwith: match END goto endstmt exit: skipif EXIT goto return next goto endstmt return: skipif RETURN goto endstmt next endstmt: skipif SEMICOL return next goto StatementSeq ; ; Qualident : IDENT ['.' IDENT] ; Qualident: match IDENT skipif PERIOD goto nextident next nextident: match IDENT return ; ; IdentDef : IDENT ['*' | '-'] ; IdentDef: match IDENT skipif STAR goto addminus next return addminus: skipif MINUS return next return ; ; Designator : IDENT ('.' IDENT | '['ExprList']' | '@' | '('Qualident ')')* ; Designator: match IDENT descont: skipif PERIOD goto bracket next match IDENT gosub descont bracket: skipif LBR goto at next gosub ExprList match RBR goto descont at: skipif AT goto par next goto descont par: skipif LPAR return next gosub Qualident match RPAR goto descont ; ; Expr : SimpleExpr [Relation SimpleExpr] ; Expr: ConstExpr: gosub SimpleExpr skipif EQ goto ne goto contexpr ne: skipif NE goto lt goto contexpr lt: skipif LT goto le goto contexpr le: skipif LE goto gt goto contexpr gt: skipif GT goto ge goto contexpr ge: skipif GE goto in goto contexpr in: skipif IN goto is goto contexpr is: skipif EQ return contexpr: next gosub SimpleExpr return ; ; SimpleExpr : ['+' | '-'] ; { ; { '~'* (Designator ['(' [ExprList] ')'] | NUMBER | CHARACTER ; | STRING | NIL | '{' [{Expr [RANGE Expr] / ','}] '}' ; | '(' Expr ')') ; / ('*' | '/' | DIV | MOD | '&')} ; / ('+' | '-' | OR)} ; SimpleExpr: skipif PLUS goto minus next goto term skipif MINUS goto term next simple: term: skipif TILDA goto factor next goto term factor: skipif NUMBER goto character next goto contterm character: skipif CHARACTER goto nil next goto contterm nil: skipif NIL goto string next goto contterm string: skipif STRING goto expr next goto contterm expr: skipif LPAR goto set next gosub Expr match RPAR goto contterm set: skipif LFPAR goto des next skipif RFPAR goto element next goto contterm element: gosub Expr skipif RANGE goto endelement next gosub Expr endelement: skipif COMMA goto endset next goto element endset: match RFPAR goto contterm des: gosub Designator skipif LPAR goto contterm next skipif RPAR goto exprlist next goto contterm exprlist: gosub ExprList match RPAR contterm: skipif STAR goto slash goto contsimple slash: skipif SLASH goto div goto contsimple div: skipif DIV goto mod goto contsimple mod: skipif MOD goto and goto contsimple and: skipif AND goto endsimple contsimple: next goto term endsimple: skipif PLUS goto minus goto contsimple minus: skipif MINUS goto or goto contsimple or: skipif OR return next goto simple ; ; IdentList : {IdentDef / ','} ; IdentList: gosub IdentDef skipif COMMA return next goto IdentList ; ; ExprList : {Expr / ','} ; ExprList: gosub Expr skipif COMMA return next goto ExprList ; ; Guard : Qualident ':' Qualident ; Guard: gosub Qualident match COLON gosub Qualident return