【问题标题】:Evaluation order of parsed tokens in RacketRacket中已解析令牌的评估顺序
【发布时间】:2014-04-29 23:40:20
【问题描述】:

我正在开发一个编译器项目,我需要用 C 语言实现函数: 首先,我使用的是 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
        )])

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

如何在开始块中获取代码以在复合 stmt 之前进行评估?

【问题讨论】:

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


    【解决方案1】:

    如何在开始块中获取代码以在复合 stmt 之前进行评估?

    你不能。

    文档说:

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

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

    您的问题的解决方案是编写一个两遍编译器。

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

    【讨论】:

    • 我通过简单地打印到一个字符串并将整个字符串返回到树上而不是直接打印到标准输出来解决了这个问题。这样我就可以简单地将下一个代码标记放在该字符串的前面或结尾,这有效地让我控制执行顺序。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多