下面为我抛出一个异常(在第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';这是个窃听器还是我漏掉了什么?
发布于 2019-05-19 16:58:33
正查找尝试匹配给定的输入,如果匹配成功,则成功,但它从不使用输入。它意味着作为序列的一部分来继续匹配序列的后续元素,只有在给定给查找的表达式可以匹配的情况下。它本身并不十分有用。
在规则Sentence: 'foo' 'bar' ( '.' | &'end' );中,最后的有序选择将尝试匹配.,而在该展望end成功之后,在该序列中没有任何匹配项,匹配为空,有序选择的分支失败。要克服这个问题,您可以将规则更改为:
Sentence: 'foo' 'bar' ( '.' | &'end' '');现在,在查找之后有一个显式的空字符串匹配,它提供了排序选择选项的结果。
https://stackoverflow.com/questions/56206580
复制相似问题