【问题标题】:How to split code string properly如何正确拆分代码字符串
【发布时间】:2015-04-20 05:28:03
【问题描述】:

我正在尝试用 Python 为 Java 编写一个基本的词法分析器。我现在面临的问题是将一行字符串拆分为单词/标记。

示例:

if (x < 3)
{
    x = 3;
}
else
{
    x = 0;
}

我希望它返回这样的列表:

["if", "(", "x", "<", "3", ")", ...

但我的代码正在返回

["if", "(x", "<", "3)"]

我的代码:

for line in code.readlines():
    for word in line.split():
        print word

我搜索了一个解决方案,但只找到了使用正则表达式的解决方案,有没有办法在没有正则表达式的情况下做到这一点?因为我不知道如何使用它们,而且我现在没有足够的时间来学习它......

任何帮助将不胜感激...

【问题讨论】:

  • 是的,但那是 Java 代码,Java 允许这样做:if (x&gt;3){}
  • 至少,您需要为您的语言提供一组有效的句法标记并与之匹配。否则,您将无法使用这种方法。
  • 看看shlex 模块。
  • @Shashank 我有一个完整的有效语法标记列表我只是在这里遇到问题,如果我能够按照我的意愿分割行,那么我将能够检查每个单词/标记针对我定义的一组标记。上面的代码只是我代码的一小部分……
  • 仅使用 Python 正则表达式来对 Java 语法中的文本进行 lex 几乎是不可能的。 pyparsing 库之类的东西可能是您需要的。

标签: python string syntax


【解决方案1】:

Python 字符串.split() 函数,拆分默认由空格分隔的字符串,并返回一个包含任何不带空格的混合字符的列表。我的简单建议是,在使用 .split() 函数之前,将符号字符替换为新的两侧空格符号:

for line in code.readlines():
    for sign in '({[<+-=*/%;>]})':
        line = line.replace(sign, ' %s ' % sign)
    for word in line.split():
        print word

【讨论】:

  • {[&lt;+-=*/%&gt;;]} 我只包括了分号,这行得通...谢谢
  • 我认为如果(x == 3)会失败。因为它将相等运算符 == 拆分为两个赋值运算符 = =。这就是你想要的吗?
  • 这段代码工作正常,但以后程序员必须检查是否有两个特殊符号相似 ==, &gt;=, '
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多