我正在使用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语法的任何答案。