WikiStart: api2mol.g

File api2mol.g, 1.6 KB (added by jlcanovas, 6 years ago)

API2MoL concrete syntax

Line 
1grammar api2mol;
2
3options {
4        k=4;
5        backtrack=true;
6}
7
8mainRule
9        : contextSection? defaultMetaclassSection? mapping*
10        ;
11       
12contextSection
13        : AT CONTEXT instanceName (COMMA instanceName)* SEMI
14        ;
15       
16defaultMetaclassSection
17        : AT DEFAULT_METACLASS ID LPAREN ID RPAREN SEMI
18        ;
19
20mapping
21        : (ENUM)? metaclassName COLON instanceName LCURLY section* RCURLY // Use semantic predicates to make easier the parser
22        ;
23
24metaclassName
25        : ID
26        ;
27       
28instanceName
29        : ID (DOT ID)*
30        ;
31
32section
33        : newSection
34        | multipleSection
35        | propertySection
36        | valueSection
37        ;
38
39newSection
40        : AT NEW constructorCall*
41        ;
42       
43multipleSection
44        : AT MULTIPLE statement*
45        ;
46
47propertySection
48        : ID COLON statement*
49        ;
50       
51valueSection
52        : ID COLON instanceName SEMI
53        ;
54
55statement
56        : ID (LPAREN variable (COMMA variable)* RPAREN)? (methodCall)? SEMI
57        ;
58
59constructorCall
60        : ID LPAREN (param (COMMA param)*)? RPAREN SEMI
61        ;
62
63methodCall
64        : ID (LPAREN (param (COMMA param)*)? RPAREN)?
65        ;
66
67variable
68        : ID
69        ;
70
71// In case we need to define a typed param...
72param
73        : ID
74        ;
75
76// keywords
77NEW      : 'new';
78MULTIPLE : 'multiple';
79ENUM     : 'enum';
80CONTEXT  : 'context';
81DEFAULT_METACLASS : 'defaultMetaclass';
82
83// Special Characters
84SLASH  : '\u005C';
85COMMA  : '\u002C';
86SEMI   : '\u003B';
87COLON  : '\u003A';
88LPAREN : '\u0028';
89RPAREN : '\u0029';
90LCURLY : '\u007B';
91RCURLY : '\u007D';
92DOT    : '\u002E';
93AT         : '\u0040';
94ID         : ('a'..'z' | 'A'..'Z' | '_' | '*') ( 'a'..'z' | 'A'..'Z' | '0'..'9' | '_')*;
95
96COMMENT                 :        '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;};
97LINE_COMMENT    :       '--' ~('\n'|'\r')* '\n' {$channel=HIDDEN;} ;
98WS                      :       (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;};