1 | module expr {
|
2 |
|
3 | tok =
|
4 | Const
|
5 | | Var
|
6 | | Op1
|
7 | | Op2
|
8 | | Paren
|
9 | | Eof
|
10 | | Invalid
|
11 |
|
12 | expr =
|
13 | Const(int i)
|
14 | | Var(string name)
|
15 | | Binary(string op, expr left, expr right)
|
16 |
|
17 | # Subtype Optimization
|
18 |
|
19 | CompoundWord < List[str]
|
20 |
|
21 | # Leaf Struct Value Optimization
|
22 | #
|
23 | # It's only different in C++
|
24 | #
|
25 | # What is affected?
|
26 | #
|
27 | # *** ASDL:
|
28 | #
|
29 | # (1) ASDL Schema Validation
|
30 | # - The Measure_v can't contain any pointers, because otherwise the GC
|
31 | # header would be wrong.
|
32 | #
|
33 | # (2) GC header for structs that contain it, like MeasuredDoc
|
34 | # They will simply IGNORE its presence
|
35 | #
|
36 | # (3) Class definition
|
37 | # - There will be no CreateNull(), because it calls Alloc()
|
38 | # - There will be no DISALLOW_COPY_AND_ASSIGN(), because that's precisely
|
39 | # what we want
|
40 | #
|
41 | # *** mycpp:
|
42 | #
|
43 | # (1) Initialization (and local var rooting)
|
44 | # m = Measure_v(3, 4) # don't do Alloc<Measure_v>()
|
45 | #
|
46 | # (2) Types - Measure_v instead of Measure_v* everywhere
|
47 | # local var types -
|
48 | # func param types
|
49 | # func return types
|
50 | #
|
51 | # (3) Attribute access
|
52 | # mdoc.measure instead of mdoc->measure
|
53 |
|
54 | Measure_v = (int a, int b)
|
55 |
|
56 | # The GC header is affected
|
57 | MeasuredDoc = (str s, Measure_v measure)
|
58 |
|
59 | }
|