Я пишу парсер для существующего языка, используя библиотеку Python TextX (на основе синтаксического анализатора Arpeggio PEG)
Но когда я пытаюсь использоватьчтобы проанализировать файл, я получаю исключение:
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)
Я отследил его до левой рекурсии Арпеджиовыпуск , где говорится, что правило, подобное A := A B
, не поддерживается и должно быть преобразовано в правило, где такой рекурсии нет.
Поэтому мой вопрос: Можно ли переписатьвышеприведенное правило Expr := Expr '+' Expr
, которое не использует левую рекурсию? Обратите внимание, что настоящее правило Expr
намного сложнее.Чуть менее упрощенной версией будет:
Expr: '(' Expr ')' | Expr '+' Expr | Expr '*' Expr' | '!' Expr | INT | STRING ;