gpt4 book ai didi

regex - 解析源代码中的注释和字符串

转载 作者:行者123 更新时间:2023-12-04 16:50:23 26 4
gpt4 key购买 nike

我正在设计和实现一种脚本语言,对于“阅读”阶段,我采用了耗时考验的直接方法,将代码拆分为标记(词法分析),然后使用基于堆栈的 AST生成器从 token 流中挤出句法结构(解析)。但是,我遇到了字符串、注释及其交互方式方面的问题。

(作为引用,我的语言中的代码使用 ~ 开始注释)

这可能是错误的方法,但我正在使用正则表达式执行词法分析步骤。对于 n 种标记,我在我的代码上运行 n 标记化传递,每次传递查找与给定正则表达式匹配的子字符串并“标记”它们,直到最终每个字符都是标记。每个正则表达式都会忽略位于已标记源部分内的匹配项,仅标记无人认领的土地。这很有用,因为例如,您不希望 number token 渗入 translate3d 之类的 token 。

我遇到的问题是嵌入在字符串中的注释和嵌入在注释中的字符串。我不知道如何同时制作这个

"The ~ is my favorite character!  It's so happy-looking!"

被标记为一个字符串,并有这个

~ "handles" the Exception (just logs it to a file nobody ever reads and moves on)

被标记为评论。似乎无论哪种方式,您都必须对词法分析的传递施加一些排序,并且注释或字符串传递将“获胜”并标记它没有业务标记化的子字符串。例如,字符串的标记如下:(我使用 XML 表示法,因为它是表示文本标记区域的好方法。我的程序实际上在任何时候都没有使用 XML)

"The <comment>~ is my favorite character!  It's so happy-looking!"</comment>

或者评论被这样标记:

<comment>~ </comment><string>"handles"</string>the Exception (just logs it to a file and moves on)

假设字符串从注释的中间开始,或者注释从字符串的中间开始。

奇怪的是,这个正则表达式系统传递标记子字符串似乎完全文本编辑器上的语法突出显示所做的事情,注释和字符串在那里工作得很好。我已经为我的语言开发了 textmate/submlime text 2 语法定义,我所要做的就是(使用实际格式的简化版本)

<syntax>
<color>
string_color
</color>
<pattern>
"[^"]*"
</pattern>
</syntax>
<syntax>
<color>
comment_color
</color>
<pattern>
~.*
</pattern>
</syntax>

当我编写示例代码时一切正常。然而,当我试图模拟我想象的文本编辑器的行为时,我遇到了上述问题。如何解决这个问题,最好以最优雅的方式解决?显然,可以添加特殊处理,在进行任何词法分析之前从源代码中删除所有注释,除了字符串中的注释(这需要读者(读者在这种情况下是机器,而不是人)来检测哪些部分of code are strings twice), 但我相信一定有更好的方法,因为 sublime text 只知道用于指定两种代码区域的正则表达式,并且只有该信息的行为完全符合预期。

最佳答案

我建议您放弃标记并使用一个正则表达式一次性对代码进行标记化,而不是在标记化源代码之前先对其进行标记,然后使用多次传递来进行标记。

如果您构造一个包罗万象的正则表达式,其中包含用于匹配和捕获每个标记的子模式,则您可以进行全局匹配并通过检查捕获组内容来确定标记类型。

在简单的例子中,如果你有一个正则表达式,比如

"([^"]*)"|~([^\n]*)|(\d+(?:.\d+)?)

匹配字符串、注释或数字,然后如果字符串匹配第一个捕获组 () 将包含它,而所有其他捕获组将为空。

因此,在您的 for each 循环 ( D Language Regular expressons ) 中,您将使用条件语句和匹配对象的捕获组内容来确定要添加的下一个标记。

而且您不必只使用一个大型正则表达式,您可以在一个捕获组中匹配多个标记类型,然后在 for each block 中应用另一个正则表达式(或 indexOf 等)在捕获组内容上来确定 token 。

关于regex - 解析源代码中的注释和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16012211/

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