source: CIVL/mods/dev.civl.abc/grammar/c/PreprocessorExpressionParser.g

main
Last change on this file was aad342c, checked in by Stephen Siegel <siegel@…>, 3 years ago

Performing huge refactor to incorporate ABC, GMC, and SARL into CIVL repo and use Java modules.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5664 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 2.5 KB
Line 
1/* CppExpresLexerg: grammar for Cpp conditional expressions.
2 *
3 *
4 */
5parser grammar PreprocessorExpressionParser;
6
7options {
8 language=Java;
9 tokenVocab=PreprocessorLexer;
10 output=AST;
11}
12
13tokens {
14 EXPR; // root node
15}
16
17@header
18{
19package dev.civl.abc.front.c.preproc;
20}
21
22// TODO: add bit-wise operators. See Cpp manual.
23
24start : expr EOF -> expr
25 ;
26
27expr : logical_or_expr
28 ;
29
30/*
31 * logical or: e1 || e2
32 * Root: OR
33 * child 0: e1
34 * child 1: e2
35 */
36logical_or_expr : (logical_and_expr -> logical_and_expr)
37 (OR arg=logical_and_expr -> ^(OR $logical_or_expr $arg))*
38 ;
39
40/*
41 * logical and: e1 && e2
42 * Root: AND
43 * child 0: e1
44 * child 1: e2
45 */
46logical_and_expr: (equality_expr -> equality_expr)
47 (AND arg=equality_expr -> ^(AND $logical_and_expr $arg))*
48 ;
49
50/*
51 * e1==e2 or e1!=e2
52 * Root: EQ or NEQ
53 * child 0: e1
54 * child 1: e2
55 */
56equality_expr : (relational_expr -> relational_expr)
57 (op=equality_operator arg=relational_expr
58 -> ^($op $equality_expr $arg))*
59 ;
60
61equality_operator
62 : EQUALS
63 | NEQ
64 ;
65
66/*
67 * e1 > e2 e1 < e2 e1 >= e2 e1 <= e2
68 * Root: one of LT, GT, LTE, GTE
69 * child 0: e1
70 * child 1: e2
71 */
72relational_expr : (additive_expr -> additive_expr)
73 (op=relational_operator arg=additive_expr
74 -> ^($op $relational_expr $arg))*
75 ;
76
77relational_operator
78 : LT
79 | GT
80 | LTE
81 | GTE
82 ;
83
84/* e1+e2 or e1-e2
85 * Root: PLUS or SUB
86 * Child 0: e1
87 * Child 1: e2
88 */
89additive_expr : (multi_expr -> multi_expr)
90 (additive_operator arg=multi_expr
91 -> ^(additive_operator $additive_expr $arg))*
92 ;
93additive_operator
94 : PLUS
95 | SUB
96 ;
97
98/* e1*e2, e1/e2, or e1%e2
99 * Root: MULTI, DIV, or MOD
100 * Child 0: e1
101 * Child 1: e2
102 */
103multi_expr : (unary_expr -> unary_expr)
104 (multi_operator unary_expr
105 -> ^(multi_operator $multi_expr unary_expr))*
106 ;
107
108multi_operator : STAR
109 | DIV
110 | MOD
111 ;
112
113/* Unary operators: +e, -e, !e, *e
114 * Root: PLUS, SUB, NOT, MULTI
115 * Child 0: e
116 */
117unary_expr : primary_expr
118 | unary_operator unary_expr -> ^(unary_operator unary_expr)
119 ;
120
121unary_operator : PLUS
122 | SUB
123 | NOT
124 | STAR
125 ;
126
127primary_expr : pp_number
128 | LPAREN expr RPAREN -> expr
129 | DEFINED ( identifier | LPAREN identifier RPAREN )
130 -> ^(DEFINED identifier)
131 | identifier
132 ;
133
134
135white : WS | NEWLINE
136 ;
137
138/* An "identifier" for the preprocessor is any C IDENTIFIER or C keyword: */
139
140identifier : IDENTIFIER ;
141
142/* a "pp_number" is any PP_NUMBER, INTEGER_CONSTANT, or FLOATING_CONSTANT */
143pp_number : INTEGER_CONSTANT | FLOATING_CONSTANT | PP_NUMBER ;
144
Note: See TracBrowser for help on using the repository browser.