aboutsummaryrefslogtreecommitdiff
path: root/language/expression.rst
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