【问题标题】:(python - cpp) - How to split the c++ codes while writing a lexical analyzer in python?(python - cpp) - 如何在用 python 编写词法分析器时拆分 c++ 代码?
【发布时间】:2022-11-16 00:22:06
【问题描述】:
我在 python 中为 cpp 代码编写了一个词法分析器,但问题是当我使用 input.split(" ") 时,它不会将 x=2 或 function() 之类的代码识别为三个不同的标记,除非我在它们之间添加一个空格手动,例如: x = 2 。
它也无法识别每行开头的标记。
(如果我在每两个标记之间以及每行的开头添加空格,我的代码可以正常工作)
我尝试先按行然后按空格拆分代码,但它变得复杂了,我仍然无法解决第一个问题。
我也想过按运营商拆分它,但我实际上无法实现它。另外,我还需要将运算符识别为令牌,所以这可能不是一个好主意。
如果有人能提供任何解决方案或建议,我将不胜感激,谢谢。
f=open("code.txt")
input=f.read()
input=input.split(" ")
f=open("code.txt")
input=f.read()
input1=input.split("\n")
for var in input1:
var=var.split(" ")
【问题讨论】:
-
如果您需要解析代码,您可能想看看AST 是什么。自己实现一个简单的,或者选择类似的东西:ANTLR
标签:
python
c++
lexical-analysis
【解决方案1】:
显然,如果您尝试成功拆分像 x=2 和 x = 2 这样的表达式......很明显这是行不通的。
您正在寻找的是一种同时适用于两者的解决方案,对吗?
基本解决方案是使用and 运算符,并使用您需要解析的条件。请注意,此解决方案不可扩展,也不适合 good practices 的类别,但它可以帮助您找出更好但更难的解决方案。
if input.split(' ') and input.split('='):
中间解决方案是使用regex。
正则表达式不是一个简单的话题,但您可以查看在线文档,然后您就有了很棒的在线工具来检查您的正则表达式代码。
Regex 101
最后一个是将您的输入数据转换为AST,它代表抽象语法树.这是 C++ 编译器采用的技术,例如 Clang。
最后一个是一个非常难的话题,所以要找出一个基本的词法分析器,可能会非常耗时,但也许它可以满足您的需求。