书上提到文法上的移进-规约冲突
:
varibale[expression]
type-id[expression] of expression
如果处理如下,
lvalue:
ID
| lvalue DOT ID
| lvalue LBRACK exp RBRACK
| ID LBRACK exp RBRACK
多加了最后一条规则, 并且增加优先级
%nonassoc ID
%nonassoc LBRACK
使得遇到ID . LBRACK
时选择移进
seqexp :
exp { $$ = A_ExpList($1, NULL); }
| exp SEMICOLON seqexp { $$ = A_ExpList($1, $3); }
因为A_ExpList
构造列表每次都是向前插入的,因此这里使用右递归的方式,否则列表顺序会倒置。
bison
文档说这样会有内存问题,先不管。
这几个的界限比较模糊
序列
形如(exp; exp; ...)
要求两个或两个以上表达式圆括号
形如(exp)
如if (a > b)
中,起到group 的作用无值
形如()
这几个都会被解释为SeqExp(ExpList())
感觉怪怪的。
我现在支持后置了,虽然语法分析我觉得不是问题,但是IDE
的提示确实是有道理的,
虽然我用vim
不需要提示,但是有更多人需要就代表这是有意义的。
代码对齐也有一点说服力。
但是缺省类型,自动推导我觉得不怎么样。 我有点不喜欢缺省类型,我想要必须声明类型。