我正在使用TextX Python (基于弓箭手 弓箭手解析器)为现有语言编写一个解析器。
但是,当我试图使用它来解析一个文件时,我得到了异常:
RecursionError: maximum recursion depth exceeded while calling a Python object下面是一个引发此异常的最小示例:
#!/usr/bin/env python
from textx import metamodel_from_str
meta_model_string = "Expr: ( Expr '+' Expr ) | INT ;"
model_string = "1 + 1"
mm = metamodel_from_str(meta_model_string, debug=True)
m = mm.model_from_str(model_string, debug=True)我将其追溯到Arpeggio的左递归问题,其中声明不支持像A := A B这样的规则,应该将其转换为没有递归的规则。
因此,我的问题是:是否可以以不使用左递归的方式重写上面的Expr := Expr '+' Expr 规则?注意,真正的Expr规则要复杂得多。它的一个稍微不那么简单的版本是:
Expr: '(' Expr ')' | Expr '+' Expr | Expr '*' Expr' | '!' Expr | INT | STRING ;发布于 2018-10-15 11:26:56
发布于 2018-10-15 10:55:08
这更典型地写成:
multop: '*' | '/'
addop: '+' | '-'
Factor: INT | STRING | '(' Expr ')' ;
Term: Factor [multop Factor]... ;
Expr: Term [addop Term]... ;现在,Expr在第一次匹配前导“(”)之前不会直接恢复自身。您还将获得与操作优先级相对应的组。(请注意,对Expr和Term的重复将产生像['1', '+', '1', '+', '1']这样的组,而您可能期望使用左递归解析器所提供的[['1', '+', '1'], '+', '1']。)
https://stackoverflow.com/questions/52811498
复制相似问题