Parsing Racket中解析令牌的求值顺序

Parsing Racket中解析令牌的求值顺序,parsing,compilation,racket,lexical-analysis,operator-precedence,Parsing,Compilation,Racket,Lexical Analysis,Operator Precedence,我正在从事一个编译器项目,需要用C-ish语言实现函数: 首先,我使用Racket解析器工具() 无论如何,我的语法中函数声明的当前规则是: (fun-declaration [(type-specifier FNCT \( \) compound-stmt) (begin $1 (printf "~nA function is being declared~n") $5 )]) 我的问题是复合stmt是

我正在从事一个编译器项目,需要用C-ish语言实现函数: 首先,我使用Racket解析器工具()

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

(fun-declaration 
     [(type-specifier FNCT \( \) compound-stmt) 
      (begin
        $1
        (printf "~nA function is being declared~n")
        $5
        )])
我的问题是复合stmt是在begin块中的代码之前计算的(这是一个占位符打印,实际代码有与问题无关的程序集)。这意味着我打印到函数setup/头文件中的任何程序集都是在复合stmt之后写入的,其中复合stmt是{code…}

如何在复合stmt之前获得begin块中要计算的代码

如何在复合stmt之前获得begin块中要计算的代码

你不能

文件说:

每个动作都是与解析器作用域相同的敲诈代码 定义,除了变量$1,…$i是绑定的,其中i 是相应产品中语法ID的数量每个$k 绑定到上第k个语法符号的操作结果 若语法符号是非终结符,则为产生式的权利,或 如果语法符号是终端,则存储在标记中的值

听起来好像您正试图编写一个单通道编译器

解决问题的办法是编写一个两遍编译器

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

我解决了这个问题,只需打印到一个字符串,然后将整个字符串返回到树上,而不是直接打印到std out。通过这种方式,我可以简单地将下一个代码标记放在该字符串的前面或末尾,这样可以有效地控制执行顺序。干杯