Autolev.g4 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. grammar Autolev;
  2. options {
  3. language = Python3;
  4. }
  5. prog: stat+;
  6. stat: varDecl
  7. | functionCall
  8. | codeCommands
  9. | massDecl
  10. | inertiaDecl
  11. | assignment
  12. | settings
  13. ;
  14. assignment: vec equals expr #vecAssign
  15. | ID '[' index ']' equals expr #indexAssign
  16. | ID diff? equals expr #regularAssign;
  17. equals: ('='|'+='|'-='|':='|'*='|'/='|'^=');
  18. index: expr (',' expr)* ;
  19. diff: ('\'')+;
  20. functionCall: ID '(' (expr (',' expr)*)? ')'
  21. | (Mass|Inertia) '(' (ID (',' ID)*)? ')';
  22. varDecl: varType varDecl2 (',' varDecl2)*;
  23. varType: Newtonian|Frames|Bodies|Particles|Points|Constants
  24. | Specifieds|Imaginary|Variables ('\'')*|MotionVariables ('\'')*;
  25. varDecl2: ID ('{' INT ',' INT '}')? (('{' INT ':' INT (',' INT ':' INT)* '}'))? ('{' INT '}')? ('+'|'-')? ('\'')* ('=' expr)?;
  26. ranges: ('{' INT ':' INT (',' INT ':' INT)* '}');
  27. massDecl: Mass massDecl2 (',' massDecl2)*;
  28. massDecl2: ID '=' expr;
  29. inertiaDecl: Inertia ID ('(' ID ')')? (',' expr)+;
  30. matrix: '[' expr ((','|';') expr)* ']';
  31. matrixInOutput: (ID (ID '=' (FLOAT|INT)?))|FLOAT|INT;
  32. codeCommands: units
  33. | inputs
  34. | outputs
  35. | codegen
  36. | commands;
  37. settings: ID (EXP|ID|FLOAT|INT)?;
  38. units: UnitSystem ID (',' ID)*;
  39. inputs: Input inputs2 (',' inputs2)*;
  40. id_diff: ID diff?;
  41. inputs2: id_diff '=' expr expr?;
  42. outputs: Output outputs2 (',' outputs2)*;
  43. outputs2: expr expr?;
  44. codegen: ID functionCall ('['matrixInOutput (',' matrixInOutput)*']')? ID'.'ID;
  45. commands: Save ID'.'ID
  46. | Encode ID (',' ID)*;
  47. vec: ID ('>')+
  48. | '0>'
  49. | '1>>';
  50. expr: expr '^'<assoc=right> expr # Exponent
  51. | expr ('*'|'/') expr # MulDiv
  52. | expr ('+'|'-') expr # AddSub
  53. | EXP # exp
  54. | '-' expr # negativeOne
  55. | FLOAT # float
  56. | INT # int
  57. | ID('\'')* # id
  58. | vec # VectorOrDyadic
  59. | ID '['expr (',' expr)* ']' # Indexing
  60. | functionCall # function
  61. | matrix # matrices
  62. | '(' expr ')' # parens
  63. | expr '=' expr # idEqualsExpr
  64. | expr ':' expr # colon
  65. | ID? ranges ('\'')* # rangess
  66. ;
  67. // These are to take care of the case insensitivity of Autolev.
  68. Mass: ('M'|'m')('A'|'a')('S'|'s')('S'|'s');
  69. Inertia: ('I'|'i')('N'|'n')('E'|'e')('R'|'r')('T'|'t')('I'|'i')('A'|'a');
  70. Input: ('I'|'i')('N'|'n')('P'|'p')('U'|'u')('T'|'t')('S'|'s')?;
  71. Output: ('O'|'o')('U'|'u')('T'|'t')('P'|'p')('U'|'u')('T'|'t');
  72. Save: ('S'|'s')('A'|'a')('V'|'v')('E'|'e');
  73. UnitSystem: ('U'|'u')('N'|'n')('I'|'i')('T'|'t')('S'|'s')('Y'|'y')('S'|'s')('T'|'t')('E'|'e')('M'|'m');
  74. Encode: ('E'|'e')('N'|'n')('C'|'c')('O'|'o')('D'|'d')('E'|'e');
  75. Newtonian: ('N'|'n')('E'|'e')('W'|'w')('T'|'t')('O'|'o')('N'|'n')('I'|'i')('A'|'a')('N'|'n');
  76. Frames: ('F'|'f')('R'|'r')('A'|'a')('M'|'m')('E'|'e')('S'|'s')?;
  77. Bodies: ('B'|'b')('O'|'o')('D'|'d')('I'|'i')('E'|'e')('S'|'s')?;
  78. Particles: ('P'|'p')('A'|'a')('R'|'r')('T'|'t')('I'|'i')('C'|'c')('L'|'l')('E'|'e')('S'|'s')?;
  79. Points: ('P'|'p')('O'|'o')('I'|'i')('N'|'n')('T'|'t')('S'|'s')?;
  80. Constants: ('C'|'c')('O'|'o')('N'|'n')('S'|'s')('T'|'t')('A'|'a')('N'|'n')('T'|'t')('S'|'s')?;
  81. Specifieds: ('S'|'s')('P'|'p')('E'|'e')('C'|'c')('I'|'i')('F'|'f')('I'|'i')('E'|'e')('D'|'d')('S'|'s')?;
  82. Imaginary: ('I'|'i')('M'|'m')('A'|'a')('G'|'g')('I'|'i')('N'|'n')('A'|'a')('R'|'r')('Y'|'y');
  83. Variables: ('V'|'v')('A'|'a')('R'|'r')('I'|'i')('A'|'a')('B'|'b')('L'|'l')('E'|'e')('S'|'s')?;
  84. MotionVariables: ('M'|'m')('O'|'o')('T'|'t')('I'|'i')('O'|'o')('N'|'n')('V'|'v')('A'|'a')('R'|'r')('I'|'i')('A'|'a')('B'|'b')('L'|'l')('E'|'e')('S'|'s')?;
  85. fragment DIFF: ('\'')*;
  86. fragment DIGIT: [0-9];
  87. INT: [0-9]+ ; // match integers
  88. FLOAT: DIGIT+ '.' DIGIT*
  89. | '.' DIGIT+;
  90. EXP: FLOAT 'E' INT
  91. | FLOAT 'E' '-' INT;
  92. LINE_COMMENT : '%' .*? '\r'? '\n' -> skip ;
  93. ID: [a-zA-Z][a-zA-Z0-9_]*;
  94. WS: [ \t\r\n&]+ -> skip ; // toss out whitespace