我正在编写一个编译器项目,我需要用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之前评估?
答案 0 :(得分:1)
如何获取begin块中的代码以在复合stmt之前评估?
你不能。
文档说:
每个操作都是与其解析器具有相同范围的Racket代码 定义,除了变量$ 1,...,$ i是绑定的,其中i 是相应生产中的语法ID数。 每个$ k 被绑定到第k个语法符号的动作结果 生产权,如果该语法符号是非终端,或 如果语法符号是终端,则存储在令牌中的值。
听起来好像是在尝试编写一次性编译器。
问题的解决方案是改为编写两遍编译器。
第一遍是解析。解析器必须生成临时的 表示解析代码的数据结构(即抽象语法树,AST)。 在第二遍中,您使用树表示来生成代码。