Lookahead inside 或子句在文本中失败
Lookahead inside or clause failing in 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';
这是一个错误,还是我遗漏了什么?
正向先行尝试匹配给定的输入,如果匹配成功则成功,但它从不消耗输入。它旨在用作序列的一部分以继续匹配序列的后续元素 only 如果可以匹配给 lookahead 的表达式。它本身不是很有用。
在规则 Sentence: 'foo' 'bar' ( '.' | &'end' );
中,末尾的有序选择将尝试匹配 .
,然后前瞻 end
会成功,但在该序列中没有任何匹配项,匹配为空,有序选择的分支失败。要解决此问题,您可以将规则更改为:
Sentence: 'foo' 'bar' ( '.' | &'end' '');
现在您在前瞻后有一个显式的空字符串匹配,它提供了有序选择的结果。
以下为我抛出异常(第 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';
这是一个错误,还是我遗漏了什么?
正向先行尝试匹配给定的输入,如果匹配成功则成功,但它从不消耗输入。它旨在用作序列的一部分以继续匹配序列的后续元素 only 如果可以匹配给 lookahead 的表达式。它本身不是很有用。
在规则 Sentence: 'foo' 'bar' ( '.' | &'end' );
中,末尾的有序选择将尝试匹配 .
,然后前瞻 end
会成功,但在该序列中没有任何匹配项,匹配为空,有序选择的分支失败。要解决此问题,您可以将规则更改为:
Sentence: 'foo' 'bar' ( '.' | &'end' '');
现在您在前瞻后有一个显式的空字符串匹配,它提供了有序选择的结果。