Взгляд внутрь или предложение не выполнено в textx - PullRequest
0 голосов
/ 19 мая 2019

Следующее выдает исключение для меня (в строке 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 Ответ

1 голос
/ 19 мая 2019

Позитивный прогноз пытается сопоставить заданный вход и успешно, если совпадение успешно, но он никогда не потребляет вход. Он предназначен для использования в качестве части последовательности для продолжения сопоставления последующих элементов последовательности только , если можно сопоставить выражение, заданное для lookahead. Сам по себе он не очень полезен.

В правиле Sentence: 'foo' 'bar' ( '.' | &'end' ); упорядоченный выбор в конце будет пытаться найти совпадение ., и после этого упреждения end будет успешным, но в этой последовательности ничего не будет найдено, совпадение пустое и эта ветвь упорядоченного выбор не удался. Чтобы преодолеть проблему, вы можете изменить правило так:

Sentence: 'foo' 'bar' ( '.' | &'end' '');

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

...