Python 语法分析的调试
我正在为一种虚构的编程语言C(不是实际的C语言)构建一个解析器。我已经到了需要将语言的语法翻译成Pyparsing可以接受的东西的阶段。不幸的是,当我解析输入字符串时(这是正确的,不应该导致Pyparsing出错),它解析不正确。我担心这是由于我的语法错误造成的,但由于我是第一次开始Pyparsing,我似乎看不出哪里出了问题 我上传了我要翻译的语法,供大家通读 编辑:根据Paul的建议进行更新 这是我目前得到的语法(我知道语法定义的前两行非常糟糕): 这是从终端运行程序时收到的错误消息:Python 语法分析的调试,python,pyparsing,Python,Pyparsing,我正在为一种虚构的编程语言C(不是实际的C语言)构建一个解析器。我已经到了需要将语言的语法翻译成Pyparsing可以接受的东西的阶段。不幸的是,当我解析输入字符串时(这是正确的,不应该导致Pyparsing出错),它解析不正确。我担心这是由于我的语法错误造成的,但由于我是第一次开始Pyparsing,我似乎看不出哪里出了问题 我上传了我要翻译的语法,供大家通读 编辑:根据Paul的建议进行更新 这是我目前得到的语法(我知道语法定义的前两行非常糟糕): 这是从终端运行程序时收到的错误消息: /U
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1156: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal( other )
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1258: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal( other )
Expected ")" (at char 30), (line:6, col:26)
None
1) 将Literal(“if”)
更改为关键字(“if”)
(依此类推,向下更改为Literal(“void”)
),以防止与名为“ifactor”
的变量的前导“if”匹配
2) nums
、alphas
和alphanums
都不是表达式,它们是字符串,在定义“单词”时,可以与Word类一起使用这些字符串来定义一些典型的字符集,例如“数字是由nums组成的单词”或“标识符是以alpha开头的单词,后跟零个或多个alphanums”因此,不是:
number = nums
identifier = alphas + OneOrMore(alphanums)
你想要
number = Word(nums)
identifier = Word(alphas, alphanums)
3) 我想您需要的不是组合,而是组。当您希望匹配的标记连续且没有中间空白时,请使用Combine
,并将连接标记并将其作为单个字符串返回<代码>组合
通常用于以下情况:
realnum = Combine(Word(nums) + "." + Word(nums))
如果没有Combine
,解析“3.14”
将返回字符串列表['3','.','14']
,因此我们添加Combine
,以便realnum的解析结果是'3.14'
(然后可以传递到解析操作以转换为实际的浮点值3.14
)Combine
s强制执行不插入空格也可以防止我们意外解析,答案是3。10太多了。
并且认为“3.10”
代表一个实数
4) 这不会导致错误,但是输入字符串有很多额外的空格。如果语法正常,您应该能够解析“int x;”
,就像解析“int x;”“
一样
希望这些提示能让你有所收获。你读过任何在线文章或教程吗?请浏览在线示例。您需要很好地掌握如何执行各自的解析任务
5) 您错误地实现了术语和语句的递归定义。不要给他们分配”
,而是写:
term = Forward()
statement = Forward()
然后,当您使用递归定义来实际定义它们时,请使用您是否有任何线索可供我们参考,例如您收到了什么错误消息(如果有)?你说“它没有正确解析”,但你怎么知道?有错误吗?是否生成了错误的AST?需要更多信息。对此表示抱歉。我已经用我试图解析的输入字符串和终端中收到的错误消息更新了我的问题。谢谢Paul。我已经替换了Combine with Group的所有实例,现在我得到了一些不同的错误,我认为这些错误与规则的编写方式有关,而不是与我使用的语法有关。我已经更新了我的原始帖子,以反映您建议的更改和我的新错误。非常好的Paul,非常感谢。我希望我能再加上你:)
realnum = Combine(Word(nums) + "." + Word(nums))
term = Forward()
statement = Forward()
term << (... term definition ...)
statement << (... statement definition ...)