📄 mod2.atg
字号:
COMPILER Mod2
/* Alternative grammar for Modula-2 */
CHARACTERS
eol = CHR(10) .
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
octDigit = "01234567" .
digit = octDigit + '89'.
hexDigit = digit + 'ABCDEF'.
noQuote1 = ANY - "'" - eol .
noQuote2 = ANY - '"' - eol .
IGNORE CHR(9) .. CHR(13)
COMMENTS
FROM '(*' TO '*)' NESTED
TOKENS
id = letter { letter | digit }.
integer = digit { digit }
| digit { digit } CONTEXT ("..")
| octDigit { octDigit } ("B" | "C")
| digit { hexDigit } "H".
real = digit { digit } "." { digit }
[ "E" [ "+" | "-" ] digit { digit } ].
string = "'" { noQuote1 } "'"
| '"' { noQuote2 } '"'.
PRODUCTIONS
Mod2 = DefMod | [ "IMPLEMENTATION" ] ProgMod .
ProgMod = "MODULE" id [ Priority ] ";" { Import } Block id "." .
Def = "CONST" { ConstDecl ";" }
| "TYPE" { id [ "=" Type ] ";" }
| "VAR" { VarDecl ";" }
| ProcHead ";" .
DefMod = "DEFINITION" "MODULE" id ";" { Import } { Def } "END" id "." .
Import = "FROM" id "IMPORT" IdList ";" | "IMPORT" id { "," id } ";" .
Export = "EXPORT" [ "QUALIFIED" ] IdList ";" .
Priority = "[" ConstExpr "]" .
ModDecl = "MODULE" id [ Priority ] ";" { Import } [ Export ] Block id .
FormType = [ "ARRAY" "OF" ] QualId .
QualId = id { "." id } .
FPSect = [ "VAR" ] IdList ":" FormType .
FormPar = "(" [ FPSect { ";" FPSect } ] ")" [ ":" QualId ] .
Decl = "CONST" { ConstDecl ";" }
| "TYPE" { TypeDecl ";" }
| "VAR" { VarDecl ";" }
| ProcDecl ";"
| ModDecl ";" .
Block = { Decl } [ "BEGIN" StatSeq ] "END" .
StatSeq = Stat { ";" Stat } .
Stat = [ Design ( ":=" Expr | [ ActPar ] )
| IfStat | CaseStat | LoopStat | ForStat
| RepeatStat | WhileStat | WithStat
| "EXIT" | "RETURN" [ Expr ]
] .
ProcHead = "PROCEDURE" id [ FormPar ] .
ProcDecl = ProcHead ";" ( Block id | "FORWARD" ) .
WithStat = "WITH" Design "DO" StatSeq "END" .
LoopStat = "LOOP" StatSeq "END" .
ForStat = "FOR" id ":=" Expr "TO" Expr [ "BY" ConstExpr ]
"DO" StatSeq "END".
RepeatStat = "REPEAT" StatSeq "UNTIL" Expr .
WhileStat = "WHILE" Expr "DO" StatSeq "END" .
Case = [ CaseLabList ":" StatSeq ] .
CaseStat = "CASE" Expr "OF" Case { "|" Case } [ "ELSE" StatSeq ] "END" .
IfStat = "IF" Expr "THEN" StatSeq
{ "ELSIF" Expr "THEN" StatSeq }
[ "ELSE" StatSeq ]
"END" .
ActPar = "(" [ ExpList ] ")" .
Elem = ConstExpr [ ".." ConstExpr ] .
Fact = integer | real | string | SetRest
| id { SetRest | "." id | "[" ExpList "]" | "^" } [ ActPar ]
| "(" Expr ")"
| ( "NOT" | "~" ) Fact.
SetRest = "{" [ Elem { "," Elem } ] "}" .
MulOp = "*" | "/" | "DIV" | "REM" | "MOD" | "AND" | "&" .
Term = Fact { MulOp Fact }.
AddOp = "+" | "-" | "OR" .
SimExpr = [ "+" | "-" ] Term { AddOp Term }.
Rel = "=" | "#" | "<>" | "<" | "<=" | ">" | ">=" | "IN" .
Expr = SimExpr [ Rel SimExpr ] .
ConstDecl = id "=" ConstExpr .
ConstExpr = Expr.
TypeDecl = id "=" Type .
Type = SimType | ArrayType | RecType
| SetType | PointerType | ProcType .
SimType = QualId [ "[" ConstExpr ".." ConstExpr "]" ]
| Enum | "[" ConstExpr ".." ConstExpr "]" .
Enum = "(" IdList ")" .
IdList = id { "," id } .
ArrayType = "ARRAY" SimType { "," SimType } "OF" Type.
RecType = "RECORD" FieldListSeq "END" .
FieldListSeq = FieldList { ";" FieldList } .
FieldList = [ IdList ":" Type
| "CASE" [ id ] ":" QualId "OF" Variant { "|" Variant }
[ "ELSE" FieldListSeq ] "END"
].
Variant = [ CaseLabList ":" FieldListSeq ] .
CaseLabList = CaseLabs { "," CaseLabs } .
CaseLabs = ConstExpr [ ".." ConstExpr ] .
SetType = "SET" "OF" SimType .
PointerType = "POINTER" "TO" Type .
ProcType = "PROCEDURE" [ FormTypeList ] .
FormTypeList = "(" [ [ "VAR" ] FormType { "," [ "VAR" ] FormType } ] ")"
[ ":" QualId ] .
VarDecl = IdList ":" Type .
Design = id { "[" ExpList "]" | "^" | "." id }.
ExpList = Expr { "," Expr }.
END Mod2.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -