forked from antlr/grammars-v4
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxdr.g4
57 lines (53 loc) · 1.54 KB
/
xdr.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
grammar xdr;
// parser rules
declaration:
typeSpecifier IDENTIFIER
| typeSpecifier IDENTIFIER '[' value ']'
| typeSpecifier IDENTIFIER '<' value? '>'
| 'opaque' IDENTIFIER '[' value ']'
| 'opaque' IDENTIFIER '<' value? '>'
| 'string' IDENTIFIER '<' value? '>'
| typeSpecifier '*' IDENTIFIER
| 'void'
;
value: constant | IDENTIFIER;
constant: DECIMAL | HEXADECIMAL | OCTAL;
typeSpecifier:
'unsigned'? 'int'
| 'unsigned'? 'hyper'
| 'float'
| 'double'
| 'quadruple'
| 'bool'
| enumTypeSpec
| structTypeSpec
| unionTypeSpec
| IDENTIFIER
;
enumTypeSpec: 'enum' enumBody;
enumBody: '{' (IDENTIFIER '=' value) (',' IDENTIFIER '=' value)* '}';
structTypeSpec: 'struct' structBody;
structBody: '{' (declaration ';') (declaration ';')* '}';
unionTypeSpec: 'union' unionBody;
unionBody: 'switch' '(' declaration ')' '{'
caseSpec
caseSpec*
('default' ':' declaration ';')?
'}';
caseSpec: ('case' value ':') ('case' value ':')* declaration ';';
constantDef: 'const' IDENTIFIER '=' constant ';';
typeDef:
'typedef' declaration ';'
| 'enum' IDENTIFIER enumBody ';'
| 'struct' IDENTIFIER structBody ';'
| 'union' IDENTIFIER unionBody ';'
;
definition: typeDef | constantDef;
xdrSpecification: definition+; //this is the top level rule for xdr (rfc 4506)
// lexer rules
COMMENT : '/*' .*? '*/' -> skip;
OCTAL : '0' [1-7] ([0-7])*;
DECIMAL : ('-')? ([0-9])+;
HEXADECIMAL : '0x' ([a-fA-F0-9])+;
IDENTIFIER : [a-zA-Z] ([a-zA-Z0-9_])*;
WS : [ \t\r\n]+ -> skip;