Взгляд внутрь или предложение не выполнено в 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' '');

Теперь у вас есть явное совпадение пустой строки после предпросмотра, которое предоставляет результат альтернативы упорядоченного выбора.

Другие вопросы по тегам