在Racket中解析令牌的评估顺序

时间:2014-04-29 23:40:21

标签: parsing compilation racket lexical-analysis operator-precedence

我正在编写一个编译器项目,我需要用C-ish语言实现函数: 首先,我使用了Racket解析器工具(http://docs.racket-lang.org/parser-tools/LALR_1__Parsers.html?q=~a

无论如何,我目前在语法中的函数声明规则是:

(fun-declaration 
     [(type-specifier FNCT \( \) compound-stmt) 
      (begin
        $1
        (printf "~nA function is being declared~n")
        $5
        )])

我的问题是在开始块中的代码之前正在评估compound-stmt(这是一个占位符打印,实际代码具有与问题无关的程序集)。这意味着我打印到函数setup / header文件的任何程序集都是在compound-stmt之后写的,其中compound-stmt是{code code code ...}

如何获取begin块中的代码以在复合stmt之前评估?

1 个答案:

答案 0 :(得分:1)

  

如何获取begin块中的代码以在复合stmt之前评估?

你不能。

文档说:

  

每个操作都是与其解析器具有相同范围的Racket代码   定义,除了变量$ 1,...,$ i是绑定的,其中i   是相应生产中的语法ID数。 每个$ k   被绑定到第k个语法符号的动作结果   生产权,如果该语法符号是非终端,或   如果语法符号是终端,则存储在令牌中的值。

听起来好像是在尝试编写一次性编译器。

问题的解决方案是改为编写两遍编译器。

第一遍是解析。解析器必须生成临时的 表示解析代码的数据结构(即抽象语法树,AST)。 在第二遍中,您使用树表示来生成代码。