Parsing Racket中解析令牌的求值顺序
我正在从事一个编译器项目,需要用C-ish语言实现函数: 首先,我使用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是
(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。通过这种方式,我可以简单地将下一个代码标记放在该字符串的前面或末尾,这样可以有效地控制执行顺序。干杯