Взгляд внутрь или предложение не выполнено в textx
Следующее вызывает исключение для меня (в строке 9), жалуясь, что Expected '.' at position (5, 15) => 'k foo bar *end '.
:
mm = metamodel_from_str('''
File: Line*;
Line: Block | Sentence;
Sentence: 'foo' 'bar' ( '.' | &'end' );
Block: 'block' Line* 'end';
''', skipws=True)
program = mm.model_from_str('''\
foo bar .
block
foo bar .
end
block foo bar end
''')
Тем не менее, он успешно разбирается, если я пишу то, что я считаю эквивалентной грамматикой:
File: Line*;
Line: Block | InnerSentence | Sentence;
Sentence: 'foo' 'bar' '.';
InnerSentence: 'foo' 'bar' &'end';
Block: 'block' Line* 'end';
Это ошибка, или я что-то упустил?
1 ответ
Позитивное ожидание пытается соответствовать заданному входу и успешно, если совпадение успешно, но оно никогда не потребляет ввод. Он предназначен для использования в качестве части последовательности для продолжения сопоставления последующих элементов последовательности только в том случае, если можно сопоставить выражение, заданное для lookahead. Это не очень полезно само по себе.
В правиле Sentence: 'foo' 'bar' ( '.' | &'end' );
упорядоченный выбор в конце будет пытаться соответствовать .
и после этого предвкушения end
будет успешным, но в этой последовательности ничего не будет найдено, совпадение будет пустым, и эта ветвь упорядоченного выбора потерпит неудачу. Чтобы преодолеть проблему, вы можете изменить свое правило так:
Sentence: 'foo' 'bar' ( '.' | &'end' '');
Теперь у вас есть явное совпадение пустой строки после предпросмотра, которое предоставляет результат альтернативы упорядоченного выбора.