summaryrefslogtreecommitdiff
path: root/qface/idl/parser/T.g4
blob: df8560e5a8f250f17917ac20f65a9c49134ab04c (plain)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright (c) Pelagicore AB 2016
grammar T;


documentSymbol
    : headerSymbol definitionSymbol*
    ;

/**
module name;
import name;
*/
headerSymbol
    : moduleSymbol importSymbol*
    ;

importSymbol
    : 'import' name=IDENTIFIER version=VERSION ';'?
    ;

moduleSymbol
    : comment=DOCCOMMENT? tagSymbol* 'module' name=IDENTIFIER version=VERSION ';'?
    ;

definitionSymbol
    : interfaceSymbol
    | structSymbol
    | enumSymbol
    ;

interfaceSymbol
    : comment=DOCCOMMENT? tagSymbol* 'interface' name=IDENTIFIER '{' interfaceMemberSymbol* '}' ';'?
    ;

interfaceMemberSymbol
    : operationSymbol
    | propertySymbol
    | signalSymbol
    ;

operationSymbol
    : comment=DOCCOMMENT?  tagSymbol* (typeSymbol | 'void') name=IDENTIFIER '(' operationParameterSymbol* ')' ';'?
    ;

signalSymbol
    : comment=DOCCOMMENT?  tagSymbol* 'signal' name=IDENTIFIER '(' operationParameterSymbol* ')' ';'?
    ;


propertySymbol
    : comment=DOCCOMMENT? tagSymbol* isReadOnly='readonly'? typeSymbol name=IDENTIFIER ';'?
    ;

operationParameterSymbol
    : typeSymbol name=IDENTIFIER ','?
    ;

tagSymbol
    : name=TAGIDENTIFIER '(' tagAttributeSymbol* ')'
    ;

tagAttributeSymbol
    : name=IDENTIFIER ('=' value=IDENTIFIER)? ','?
    ;

typeSymbol
    : primitiveTypeSymbol
    | complexTypeSymbol
    | listTypeSymbol
    | modelTypeSymbol
    ;

complexTypeSymbol
    : name=IDENTIFIER
    ;

primitiveTypeSymbol
    : name='bool'
    | name='int'
    | name='real'
    | name='string'
    | name='var'
    ;

listTypeSymbol
    : 'list' '<' valueType=typeSymbol '>'
    ;

modelTypeSymbol
    : 'model' '<' valueType=typeSymbol '>'
    ;

structSymbol
    : comment=DOCCOMMENT? tagSymbol* 'struct' name=IDENTIFIER '{' structFieldSymbol* '}' ';'?
    ;

structFieldSymbol
    : comment=DOCCOMMENT? tagSymbol* typeSymbol name=IDENTIFIER ';'?
    ;

enumSymbol
    : comment=DOCCOMMENT? tagSymbol* enumTypeSymbol name=IDENTIFIER '{' enumMemberSymbol* '}' ';'?
    ;

enumTypeSymbol
    : isEnum = 'enum'
    | isFlag = 'flag'
    ;

enumMemberSymbol
    : comment=DOCCOMMENT? tagSymbol* name=IDENTIFIER ('=' intSymbol)? ','?
    ;

intSymbol
    : value=INTCONSTANT
    | value=HEXCONSTANT
    ;

INTCONSTANT     : ('+' | '-')? '0'..'9'+;
HEXCONSTANT     : '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+;
TAGIDENTIFIER   : '@'[a-zA-Z_][a-zA-Z0-9_.]*;
IDENTIFIER      : [a-zA-Z_][a-zA-Z0-9_.]*;
VERSION         : [0-9]'.'[0-9];
DOCCOMMENT      : '/**' .*? '*/';
WHITESPACE      : [ \t\r\n]+ -> skip;
COMMENT         : '//' ~[\r\n]* -> skip;
MULTICOMM       : '/*' .*? '*/' -> skip;