textx中的先行内部或子句失败

2024-09-29 19:26:53 发布

您现在位置:Python中文网/ 问答频道 /正文

下面为我抛出了一个异常(在第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';

这是一个错误,还是我遗漏了什么


Tags: fromfoolinebarpositionblocksentenceat
1条回答
网友
1楼 · 发布于 2024-09-29 19:26:53

正向前瞻尝试匹配给定的输入,如果匹配成功,则会成功,但它从不使用输入。如果给定给lookahead的表达式可以匹配,则它将用作序列的一部分,以继续匹配序列的后续元素。它本身不是很有用

在规则Sentence: 'foo' 'bar' ( '.' | &'end' );中,末尾的有序选择将尝试匹配.,在该规则之后end将成功,但在该序列中没有任何匹配项,匹配项为空,有序选择的分支失败。要解决此问题,您可以将规则更改为:

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

现在,在提供有序选择选项结果的前瞻之后,有一个显式的空字符串匹配

相关问题 更多 >

    热门问题