antlr语法避免尖括号

时间:2016-09-01 18:55:53

标签: c# antlr antlr4 antlr4cs

this question我问过从任意文本中提取标签。提供的解决方案运作良好,但我想处理一个边缘案例。回顾一下,我正在解析任意用户输入的文本,并希望出现<>以符合有效的标记语法。如果尖括号不是有效标记的一部分,则应将其转义为&lt;&gt;。我正在寻找的语法是<foo#123>,其中foo是来自固定条目列表的文本,123是数字[0-9]+。解析器:

parser grammar TagsParser;

options {
    tokenVocab = TagsLexer;
}

parse: (tag | text)* EOF;
tag: LANGLE fixedlist GRIDLET ID RANGLE;
text: NOANGLE;
fixedlist: FOO | BAR | BAZ;

词霸:

lexer grammar TagsLexer;

LANGLE: '<' -> pushMode(tag);
NOANGLE: ~[<>]+;

mode tag:

RANGLE: '>' -> popMode;
GRIDLET: '#';
FOO: 'foo';
BAR: 'bar';
BAZ: 'baz';
ID: [0-9]+;
OTHERTEXT: . ;

这很有效并且成功解析了以下文本:

<foo#123>
Hi <bar#987>!
<baz#1><foo#2>anythinghere<baz#3>
if 1 &lt; 2

当我使用BailErrorStrategy

时,它也成功地失败了以下内容
<foo123>
<bar#a>
<foo#123H>
<unsupported#123>
if 1 < 2

最后一个成功失败,因为<进入tag模式且与支持的标记格式不匹配。但是,我还想在文本中避免>的实例,因此以下内容也应该失败:

if 2 > 1

该文本应指定为if 2 &gt; 1,而不是原始尖括号。

如何修改语法,以便不属于有效标记的>出现无法解析?

1 个答案:

答案 0 :(得分:1)

正如你的语法现在一样,它会在带有令牌识别错误的标签之外失败>,因为>不会出现在tag模式之外的词法分析器语法中。这是一个失败,因为它是。但如果你坚持在解析期间失败,那么只需在词法分析器的默认模式中添加直角:

lexer grammar TagsLexer;

LANGLE: '<' -> pushMode(tag);
NOANGLE: ~[<>]+;
BADRANGLE: '>';

mode tag;

RANGLE: '>' -> popMode;
...

然后,在解析过程中,标记之外的>将失败。