119 lines
4.1 KiB
Plaintext
119 lines
4.1 KiB
Plaintext
|
grammar Autolev;
|
||
|
|
||
|
options {
|
||
|
language = Python3;
|
||
|
}
|
||
|
|
||
|
prog: stat+;
|
||
|
|
||
|
stat: varDecl
|
||
|
| functionCall
|
||
|
| codeCommands
|
||
|
| massDecl
|
||
|
| inertiaDecl
|
||
|
| assignment
|
||
|
| settings
|
||
|
;
|
||
|
|
||
|
assignment: vec equals expr #vecAssign
|
||
|
| ID '[' index ']' equals expr #indexAssign
|
||
|
| ID diff? equals expr #regularAssign;
|
||
|
|
||
|
equals: ('='|'+='|'-='|':='|'*='|'/='|'^=');
|
||
|
|
||
|
index: expr (',' expr)* ;
|
||
|
|
||
|
diff: ('\'')+;
|
||
|
|
||
|
functionCall: ID '(' (expr (',' expr)*)? ')'
|
||
|
| (Mass|Inertia) '(' (ID (',' ID)*)? ')';
|
||
|
|
||
|
varDecl: varType varDecl2 (',' varDecl2)*;
|
||
|
|
||
|
varType: Newtonian|Frames|Bodies|Particles|Points|Constants
|
||
|
| Specifieds|Imaginary|Variables ('\'')*|MotionVariables ('\'')*;
|
||
|
|
||
|
varDecl2: ID ('{' INT ',' INT '}')? (('{' INT ':' INT (',' INT ':' INT)* '}'))? ('{' INT '}')? ('+'|'-')? ('\'')* ('=' expr)?;
|
||
|
|
||
|
ranges: ('{' INT ':' INT (',' INT ':' INT)* '}');
|
||
|
|
||
|
massDecl: Mass massDecl2 (',' massDecl2)*;
|
||
|
|
||
|
massDecl2: ID '=' expr;
|
||
|
|
||
|
inertiaDecl: Inertia ID ('(' ID ')')? (',' expr)+;
|
||
|
|
||
|
matrix: '[' expr ((','|';') expr)* ']';
|
||
|
matrixInOutput: (ID (ID '=' (FLOAT|INT)?))|FLOAT|INT;
|
||
|
|
||
|
codeCommands: units
|
||
|
| inputs
|
||
|
| outputs
|
||
|
| codegen
|
||
|
| commands;
|
||
|
|
||
|
settings: ID (EXP|ID|FLOAT|INT)?;
|
||
|
|
||
|
units: UnitSystem ID (',' ID)*;
|
||
|
inputs: Input inputs2 (',' inputs2)*;
|
||
|
id_diff: ID diff?;
|
||
|
inputs2: id_diff '=' expr expr?;
|
||
|
outputs: Output outputs2 (',' outputs2)*;
|
||
|
outputs2: expr expr?;
|
||
|
codegen: ID functionCall ('['matrixInOutput (',' matrixInOutput)*']')? ID'.'ID;
|
||
|
|
||
|
commands: Save ID'.'ID
|
||
|
| Encode ID (',' ID)*;
|
||
|
|
||
|
vec: ID ('>')+
|
||
|
| '0>'
|
||
|
| '1>>';
|
||
|
|
||
|
expr: expr '^'<assoc=right> expr # Exponent
|
||
|
| expr ('*'|'/') expr # MulDiv
|
||
|
| expr ('+'|'-') expr # AddSub
|
||
|
| EXP # exp
|
||
|
| '-' expr # negativeOne
|
||
|
| FLOAT # float
|
||
|
| INT # int
|
||
|
| ID('\'')* # id
|
||
|
| vec # VectorOrDyadic
|
||
|
| ID '['expr (',' expr)* ']' # Indexing
|
||
|
| functionCall # function
|
||
|
| matrix # matrices
|
||
|
| '(' expr ')' # parens
|
||
|
| expr '=' expr # idEqualsExpr
|
||
|
| expr ':' expr # colon
|
||
|
| ID? ranges ('\'')* # rangess
|
||
|
;
|
||
|
|
||
|
// These are to take care of the case insensitivity of Autolev.
|
||
|
Mass: ('M'|'m')('A'|'a')('S'|'s')('S'|'s');
|
||
|
Inertia: ('I'|'i')('N'|'n')('E'|'e')('R'|'r')('T'|'t')('I'|'i')('A'|'a');
|
||
|
Input: ('I'|'i')('N'|'n')('P'|'p')('U'|'u')('T'|'t')('S'|'s')?;
|
||
|
Output: ('O'|'o')('U'|'u')('T'|'t')('P'|'p')('U'|'u')('T'|'t');
|
||
|
Save: ('S'|'s')('A'|'a')('V'|'v')('E'|'e');
|
||
|
UnitSystem: ('U'|'u')('N'|'n')('I'|'i')('T'|'t')('S'|'s')('Y'|'y')('S'|'s')('T'|'t')('E'|'e')('M'|'m');
|
||
|
Encode: ('E'|'e')('N'|'n')('C'|'c')('O'|'o')('D'|'d')('E'|'e');
|
||
|
Newtonian: ('N'|'n')('E'|'e')('W'|'w')('T'|'t')('O'|'o')('N'|'n')('I'|'i')('A'|'a')('N'|'n');
|
||
|
Frames: ('F'|'f')('R'|'r')('A'|'a')('M'|'m')('E'|'e')('S'|'s')?;
|
||
|
Bodies: ('B'|'b')('O'|'o')('D'|'d')('I'|'i')('E'|'e')('S'|'s')?;
|
||
|
Particles: ('P'|'p')('A'|'a')('R'|'r')('T'|'t')('I'|'i')('C'|'c')('L'|'l')('E'|'e')('S'|'s')?;
|
||
|
Points: ('P'|'p')('O'|'o')('I'|'i')('N'|'n')('T'|'t')('S'|'s')?;
|
||
|
Constants: ('C'|'c')('O'|'o')('N'|'n')('S'|'s')('T'|'t')('A'|'a')('N'|'n')('T'|'t')('S'|'s')?;
|
||
|
Specifieds: ('S'|'s')('P'|'p')('E'|'e')('C'|'c')('I'|'i')('F'|'f')('I'|'i')('E'|'e')('D'|'d')('S'|'s')?;
|
||
|
Imaginary: ('I'|'i')('M'|'m')('A'|'a')('G'|'g')('I'|'i')('N'|'n')('A'|'a')('R'|'r')('Y'|'y');
|
||
|
Variables: ('V'|'v')('A'|'a')('R'|'r')('I'|'i')('A'|'a')('B'|'b')('L'|'l')('E'|'e')('S'|'s')?;
|
||
|
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')?;
|
||
|
|
||
|
fragment DIFF: ('\'')*;
|
||
|
fragment DIGIT: [0-9];
|
||
|
INT: [0-9]+ ; // match integers
|
||
|
FLOAT: DIGIT+ '.' DIGIT*
|
||
|
| '.' DIGIT+;
|
||
|
EXP: FLOAT 'E' INT
|
||
|
| FLOAT 'E' '-' INT;
|
||
|
LINE_COMMENT : '%' .*? '\r'? '\n' -> skip ;
|
||
|
ID: [a-zA-Z][a-zA-Z0-9_]*;
|
||
|
WS: [ \t\r\n&]+ -> skip ; // toss out whitespace
|