-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathscalaToCpp.g4
94 lines (92 loc) · 3.42 KB
/
scalaToCpp.g4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
grammar scalaToCpp;
//tokens
CLASS: 'class';
OBJECT: 'object';
TRAIT: 'trait';
DEF: 'def';
NEW: 'new';
PRIVATE: 'private';
PUBLIC: 'public';
PROTECTED: 'protected';
LPAREN: '(';
RPAREN: ')';
LBRACE: '{';
RBRACE: '}';
COMMA: ',';
DOT: '.';
EQ: '=';
SEMICOLON: ';';
COLON: ':';
IF: 'if';
ELSE: 'else';
WHILE: 'while';
FOR: 'for';
RETURN: 'return';
VAR: 'var';
VAL: 'val';
ARROW: '<-';
EQEQ: '==';
NEQ: '!=';
LT: '<';
GT: '>';
LTEQ: '<=';
GTEQ: '>=';
PRO: '%';
AND: '&&';
OR: '||';
PLUS: '+';
MINUS: '-';
ASTERISK: '*';
SLASH: '/';
BANG: '!';
LIST: 'List';
PRINT: 'println';
BOOLEAN_LITERAL: 'true' | 'false';
INT_LITERAL: [0-9]+;
STRING_LITERAL: '"' ~('"')* '"';
IDENTIFIER: [a-zA-Z][a-zA-Z0-9]*;
WS: [ \t\r\n]+ -> skip;
//productions
plure: topLevelDef* EOF;
topLevelDef: classDef | objectDef | traitDef | def;
classDef: accessModifier? CLASS IDENTIFIER classBody;
accessModifier: PUBLIC | PRIVATE | PROTECTED;
objectDef: accessModifier? OBJECT IDENTIFIER classBody;
traitDef: accessModifier? TRAIT IDENTIFIER traitBody;
def: accessModifier? DEF IDENTIFIER parameterList returnType EQ defBlock;
classBody: LBRACE classMember* RBRACE;
traitBody: LBRACE traitMember* RBRACE;
classMember: classDef | def | assignment SEMICOLON | definition SEMICOLON;
traitMember: traitDef | def;
parameterList: LPAREN parameter (COMMA parameter)* RPAREN | LPAREN RPAREN;
parameter: IDENTIFIER COLON IDENTIFIER;
returnType: COLON IDENTIFIER | /* epsilon */ ;
defBlock: LBRACE statement* returnVal? RBRACE;
block: LBRACE statement* RBRACE;
returnVal: RETURN expressionStatement;
statement: block | ifStatement | whileStatement | forStatement | expressionStatement;
ifStatement: IF LPAREN logicExpression RPAREN (block | statement) elseStatement?;
elseStatement: ELSE (block | statement);
whileStatement: WHILE LPAREN logicExpression RPAREN (block | statement);
forStatement: FOR LPAREN (enumeration) RPAREN (block | statement);
enumeration: IDENTIFIER ARROW (expression|listliteral);
expressionStatement: (expression | printStatement) SEMICOLON;
printStatement: PRINT printList;
printList: LPAREN (expression (printListElement)*)? RPAREN;
printListElement: PLUS expression;
logicExpression: expression binaryOperator expression | unaryOperator expression | LPAREN expression RPAREN;
expression: literal | IDENTIFIER | functionCall | objectMethodAccess | assignment | definition;
functionCall: IDENTIFIER argumentList;
objectMethodAccess: IDENTIFIER DOT IDENTIFIER argumentList?;
argumentList: LPAREN (expression (argumentListElement)*)? RPAREN;
argumentListElement: COMMA expression;
definition: (VAR | VAL |) IDENTIFIER;
assignment: (VAR | VAL |) IDENTIFIER EQ (operation | creation | listliteral);
listliteral: LIST LPAREN (literal | creation | functionCall) (listLiteralElement)*? RPAREN;
listLiteralElement: (COMMA (literal|creation|functionCall));
operation: (IDENTIFIER | literal) (simpleOperator (IDENTIFIER | literal))*;
creation: NEW? functionCall;
binaryOperator: EQEQ | NEQ | LT | GT | LTEQ | GTEQ | AND | OR | PRO;
unaryOperator: PLUS | MINUS | BANG;
simpleOperator: PLUS | MINUS | ASTERISK | SLASH;
literal: BOOLEAN_LITERAL | INT_LITERAL | STRING_LITERAL;