(python - cpp)-在用python写词法分析器的时候如何拆分c++代码?

bnlyeluc  于 2022-11-19  发布在  Python
关注(0)|答案(2)|浏览(167)

我在python中为cpp代码编写了一个词法分析器,但问题是当我使用input.split(““)时,它不会将x=2或function()这样的代码识别为三个不同的标记,除非我在它们之间手动添加一个空格,例如:x = 2。它也无法识别每行开头的标记。(如果我在每两个标记之间以及每行开头添加空格,我的代码就能正常工作)
我试着先按行再按空格来拆分代码,但它变得很复杂,我仍然无法解决第一个问题。我也想过按操作符来拆分它,但我实际上无法实现它。再加上我还需要操作符被识别为令牌,所以这可能不是一个好主意。如果有人能给予任何解决方案或建议,我将不胜感激,谢谢。
第一个

bejyjqdl

bejyjqdl1#

显然,如果你试图成功地拆分这样一个表达式,比如x=2x = 2 ......很明显,这是行不通的。
您正在寻找的是一个同时适用于这两种情况的解决方案,对吗?
基本的解决方案是使用and运算符,并使用您需要解析的条件。注意,这种解决方案是不可扩展的,也不适合good practices的类别,但它可以帮助您找出更好但更难的解决方案。

if input.split(' ') and input.split('='):

一个中间的解决方案是使用regex。正则表达式不是一个简单的主题,但是您可以查阅在线文档,然后您就有了很棒的在线工具来检查您的正则表达式代码。Regex 101
最后一个是把你的输入数据转换成AST,它代表 abstract syntax tree。这是C++编译器采用的技术,比如Clang。最后一个是一个真实的难的主题,所以要弄清楚一个基本的词法分析器,可能会非常耗时,但也许它能满足你的需要。

trnvg8h3

trnvg8h32#

通常的方法是从左到右扫描输入的文本。在每个字符位置,词法分析器选择最长的字符串,该字符串符合“词素”的某种模式,该词素是标记或被忽略的输入(例如,空格和注解)。然后继续扫描下一个字符。
词法模式通常使用正则表达式来描述,但是标准正则表达式模块re对这个过程没有多大帮助,因为它不具备并行检查多个正则表达式的功能。(未来可能的替代品regex模块也不例外。)或者,更准确地说,库可以并行检查多个表达式(使用交替语法,(...|...|...)),但是它缺少一个接口来报告匹配了哪一个备选项。因此,有必要一次一个地尝试每种可能的模式,并选择结果具有最长匹配的模式。
注意,匹配 * 总是 * 锚定在当前输入点;词法分析器不搜索匹配的模式。2每个输入的字符都成为某个词位的一部分,即使那个词位被忽略,并且词位不重叠。
您可以为简单的语言手工编写这样的分析器,但C++不是简单的语言,手工构建的词法分析器肯定是存在的,但我所看到的都是上千行可读性不强的代码。所以通常使用专门设计的软件自动构建一个分析器会更容易。这些软件已经存在很长时间了--例如,Lex是在大约50年前编写的--如果您计划编写多个词法分析器,最好研究一下一些可用的工具。

备注

  1. PCRE 2和Oniguruma regex库提供了一个“callout”特性,我相信它可以用于此目的。我还没有在词法分析中实际看到它的使用,但它是一个相当新的添加,特别是对于Oniguruma,就我所知,这两个库的Python绑定没有 Package callout特性。(虽然,像通常的Python绑定到C库一样,文档几乎不存在,所以我不能肯定。)

相关问题