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