在Python中解析函数的问题(可选择使用pyparsing)

时间:2016-11-13 04:12:02

标签: python parsing pyparsing bnf

我正在使用pyparsing库来解析类似python的编程语言。我似乎无法弄清楚如何将BNF语法翻译成可执行代码。

我的脚本显然比这更复杂,但我把这个问题简化为几行:

arg_or_func_name = Word(alphanums + '_')
expr = Forward()
func = expr + Literal('(') + Literal(')')
expr << (arg_or_func_name | func)
statement = expr + Literal(';')

parsed = statement.parseString('func_a();')

我希望将其解析为[('expr', [('func', ['func_a', '(', ')')])]), ';']。相反,它会导致错误pyparsing.ParseException: Expected ";",我假设因为它贪婪地将func_a视为arg_or_func_name,然后忽略括号。

但是,当我颠倒expr语句的顺序并将其更改为

expr << (func | arg_or_func_name)

或当我做的时候

expr << (func ^ arg_or_func_name)

我得到最大递归深度超出错误;显然按此顺序搜索会导致一些无限的递归循环。

我希望我的程序能够匹配最长的字符串(特别是所有的func_a()),但是这种方式不会导致无限循环。这可能吗?

我更愿意继续使用pyparsing,所以使用该库的答案将是首选,但我也很感激使用其他python工具翻译BNF语法的任何答案。

0 个答案:

没有答案