gpt4 book ai didi

parsing - 如何用基于语法的解析器替换宏?

转载 作者:行者123 更新时间:2023-12-02 10:27:28 25 4
gpt4 key购买 nike

我需要一个用于异国编程语言的解析器。我为它编写了一个语法,并使用解析器生成器(PEGjs)来生成解析器。这工作得很好......除了一件事:宏(用预定义的文本替换占位符)。我不知道如何将其整合到语法中。让我来说明一下问题:

要解析的示例程序通常如下所示:

instructionA parameter1, parameter2
instructionB parameter1
instructionC parameter1, parameter2, parameter3

到目前为止没有问题。但该语言也支持宏:

Define MacroX { foo, bar }
instructionD parameter1, MacroX, parameter4

Define MacroY(macroParameter1, macroParameter2) {
instructionE parameter1, macroParameter1
instructionF macroParameter2, MacroX
}

instructionG parameter1, MacroX
MacroY

当然,我可以定义一个语法来识别宏和对宏的引用。但在这种情况下,我不知道如何解析宏的内容,因为不清楚宏包含什么。它可以只是一个参数(这是最简单的),但也可以是一个宏中的多个参数(如我的示例中的 MacroX,它代表两个参数)或一整 block 指令(如 MacroY)。宏甚至可以包含其他宏。如果不清楚宏的语义是什么,我该如何将其放入语法中?

最简单的方法似乎是首先运行预处理器来替换所有宏,然后才运行解析器。但在这种情况下,行号就会变得困惑。如果存在解析错误,我希望解析器生成包含行号的错误消息。如果我对输入进行预处理,行号就不再对应。

非常感谢您的帮助。

最佳答案

宏处理器往往不尊重语言元素的边界;本质上,他们(通常)可以对明显的输入字符串进行任意更改。

如果是这种情况,您别无选择:您需要构建一个宏处理器,可以保留行号。

如果宏始终包含结构良好的语言元素,并且它们始终出现在代码中的结构化位置,那么您可以添加宏定义的概念并调用您的语法。这可能会使你的解析不明确; C代码中的foo(x)可能是宏调用,也可能是函数调用。你必须以某种方式解决这种歧义。 C 解析器过去通过在解析时收集符号表信息来解决此类歧义问题;如果您在解析时收集 is-foo-a-macro,那么您可以确定 foo(x) 是否是宏调用。

关于parsing - 如何用基于语法的解析器替换宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com