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