blob: 57573a79e98d26d225e82970d5131fdecc3613a8 (
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
|
Expressions
-----------
.. crowbar:element:: AtomicExpression <- identifier / constant / 'true' / 'false' / string-literal / '(' Expression ')'
.. crowbar:element:: ObjectExpression <- AtomicExpression ObjectSuffix* / ArrayLiteral / StructLiteral
ObjectSuffix <- ArrayIndexSuffix / FunctionCallSuffix / StructElementSuffix / StructPointerElementSuffix
.. crowbar:element:: ArrayIndexSuffix <- '[' Expression ']'
.. crowbar:element:: FunctionCallSuffix <- '(' CommasExpressionList? ')'
CommasExpressionList <- Expression (',' Expression)* ','?
.. crowbar:element:: StructElementSuffix <- '.' identifier
.. crowbar:element:: StructPointerElementSuffix <- '->' identifier
.. crowbar:element:: ArrayLiteral <- '{' CommasExpressionList '}'
.. crowbar:element:: StructLiteral <- '{' StructLiteralElement (',' StructLiteralElement)* ','? '}'
StructLiteralElement <- '.' identifier '=' Expression
.. crowbar:element:: FactorExpression <- CastExpression / AddressOfExpression / DerefExpression / PositiveExpression / NegativeExpression / BitwiseNotExpression / LogicalNotExpression / SizeofExpression / ObjectExpression
.. crowbar:element:: CastExpression <- '(' Type ')' ObjectExpression
.. crowbar:element:: AddressOfExpression <- '&' ObjectExpression
.. crowbar:element:: DerefExpression <- '*' ObjectExpression
.. crowbar:element:: PositiveExpression <- '+' ObjectExpression
.. crowbar:element:: NegativeExpression <- '-' ObjectExpression
.. crowbar:element:: BitwiseNotExpression <- '~' ObjectExpression
.. crowbar:element:: LogicalNotExpression <- '!' ObjectExpression
.. crowbar:element:: SizeofExpression <- 'sizeof' ObjectExpression / 'sizeof' Type
.. crowbar:element:: TermExpression <- FactorExpression TermSuffix?
TermSuffix <- ('*' FactorExpression)+ / ('/' FactorExpression)+ / ('%' FactorExpression)+
.. crowbar:element:: ArithmeticExpression <- TermExpression ArithmeticSuffix?
ArithmeticSuffix <- ('+' TermExpression)+ / ('-' TermExpression)+
.. crowbar:element:: BitwiseOpExpression <- ShiftExpression / XorExpression / BitwiseAndExpression / BitwiseOrExpression / ArithmeticExpression
.. crowbar:element:: ShiftExpression <- ArithmeticExpression '<<' ArithmeticExpression / ArithmeticExpression '>>' ArithmeticExpression
.. crowbar:element:: XorExpression <- ArithmeticExpression '^' ArithmeticExpression
.. crowbar:element:: BitwiseAndExpression <- ArithmeticExpression ('&' ArithmeticExpression)+
.. crowbar:element:: BitwiseOrExpression <- ArithmeticExpression ('|' ArithmeticExpression)+
.. crowbar:element:: ComparisonExpression <- EqualExpression / NotEqualExpression / LessEqExpression / GreaterEqExpression / LessThanExpression / GreaterThanExpression / BitwiseOpExpression
.. crowbar:element:: EqualExpression <- BitwiseOpExpression '==' BitwiseOpExpression
.. crowbar:element:: NotEqualExpression <- BitwiseOpExpression '!=' BitwiseOpExpression
.. crowbar:element:: LessEqExpression <- BitwiseOpExpression '<=' BitwiseOpExpression
.. crowbar:element:: GreaterEqExpression <- BitwiseOpExpression '>=' BitwiseOpExpression
.. crowbar:element:: LessThanExpression <- BitwiseOpExpression '<' BitwiseOpExpression
.. crowbar:element:: GreaterThanExpression <- BitwiseOpExpression '>' BitwiseOpExpression
.. crowbar:element:: LogicalOpExpression <- LogicalAndExpression / LogicalOrExpression / ComparisonExpression
.. crowbar:element:: LogicalAndExpression <- ComparisonExpression ('&&' ComparisonExpression)+
.. crowbar:element:: LogicalOrExpression <- ComparisonExpression ('||' ComparisonExpression)+
.. crowbar:element:: Expression <- LogicalOpExpression
.. todo:: literally all the expression definitions
.. todo:: figure out if this hierarchy can be tidied up
|