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