microada.atg 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. COMPILER MAda
  2. (* A micro subset of Ada as used by H Dobler in "Compilerbau I". *)
  3. IGNORE CASE
  4. CHARACTERS
  5. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  6. digit = "0123456789".
  7. eol = CHR(13) .
  8. anyButQuote = ANY - '"' - eol .
  9. COMMENTS
  10. FROM "--" TO eol
  11. TOKENS
  12. id = letter { ["_"] (letter | digit) }.
  13. number = digit { ["_"] digit}.
  14. string = '"' {anyButQuote | '""'} '"'.
  15. PRODUCTIONS
  16. MAda = "PACKAGE" id "IS" {Declaration} "BEGIN" {Stat} "END" [id] ";".
  17. Declaration = ObjsDecl | ProcDecl.
  18. ObjsDecl = IdList ":" Type.
  19. IdList = id {"," id}.
  20. Type = "ARRAY" "(" Range ")" "OF" SimpleType.
  21. SimpleType = "INTEGER" | "CHARACTER" | "BOOLEAN".
  22. ProcDecl = "PROCEDURE" id FormalPart
  23. ["IS" {Declaration} "BEGIN" {Stat} "END" [id]] ";".
  24. FormalPart = ["(" ParamDecl {";" ParamDecl} ")"].
  25. ParamDecl = IdList ":" [ParamMode] ["ARRAY" "OF"] SimpleType.
  26. ParamMode = "IN" ["OUT"] | "OUT".
  27. Stat = Name ":=" Expr ";"
  28. | Name ";"
  29. | "IF" Expr "THEN" {Stat}
  30. ["ELSIF" Expr "THEN" {Stat}] ["ELSE" {Stat}] "END" "IF" ";"
  31. | [id ":"] [IterClause] "LOOP" {Stat} "END" "LOOP" ";"
  32. | "EXIT" [id] ["WHEN" Expr] ";"
  33. | "RETURN" ";"
  34. | "NULL" ";"
  35. | "READ" "(" Name "," Name ")" ";"
  36. | "READLN" "(" Name ")" ";"
  37. | "WRITE" "(" Expr ["," Expr] ")" ";"
  38. | "WRITELN" ";".
  39. IterClause = "WHILE" Expr | "FOR" id "IN" ["REVERSE"] Range.
  40. Range = Expr ".." Expr.
  41. Name = id [NameSuffix] | SimpleType "'" "VAL" "(" Expr ")".
  42. NameSuffix = "(" Expr {"," Expr} ")" | "'" "CHAR"
  43. | "'" "FIRST" | "'" "LAST".
  44. Expr = Relation [ ( "AND" ["THEN"] | "OR" ["ELSE"] ) Relation].
  45. Relation = SimpleExpr [RelOp SimpleExpr].
  46. SimpleExpr = [AddOp] Term {AddOp Term}.
  47. Term = Factor {MulOp Factor}.
  48. Factor = [ "NOT" | "ABS" ] Primary.
  49. Primary = Name | number | string | "TRUE" | "FALSE" | "(" Expr ")".
  50. RelOp = "<" | "<=" | "=" | "/=" | ">=" | ">".
  51. AddOp = "+" | "-".
  52. MulOp = "*" | "/" | "MOD".
  53. END MAda.