Skip to content

Latest commit

 

History

History
69 lines (44 loc) · 1.74 KB

ch3-4.md

File metadata and controls

69 lines (44 loc) · 1.74 KB

语法分析、抽象语法

左值lvalue 的规则定义

书上提到文法上的移进-规约冲突 :

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 不需要提示,但是有更多人需要就代表这是有意义的。

Types are moving to the right

代码对齐也有一点说服力。

但是缺省类型,自动推导我觉得不怎么样。 我有点不喜欢缺省类型,我想要必须声明类型。