antlr语法避免尖括号
antlr grammar avoiding angle brackets
在 中,我询问了有关从任意文本中提取标签的问题。提供的解决方案运行良好,但我想处理一种极端情况。回顾一下,我正在解析任意用户输入的文本,并希望出现任何 <
或 >
以符合有效的标记语法。如果尖括号不是有效标记的一部分,则应将其转义为 <
或 >
。我正在寻找的语法是 <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 < 2
当我使用 BailErrorStrategy
时,它也成功地失败了以下:
<foo123>
<bar#a>
<foo#123H>
<unsupported#123>
if 1 < 2
最后一个成功失败,因为 <
进入 tag
模式并且它与支持的标签格式不匹配。但是,我也想避免在文本中出现 >
的实例,因此以下内容也应该失败:
if 2 > 1
该文本应指定为 if 2 > 1
而不是原始尖括号。
我如何修改语法,使不属于有效标记的 >
的出现无法解析?
按照您现在的语法,它会在标记识别错误的标记之外失败 >
,因为 >
没有出现在 tag
之外的词法分析器语法中模式。这是一个失败,好吧,因为它是。但是如果你坚持在 parse 期间失败,那么只需将直角添加到词法分析器的默认模式:
lexer grammar TagsLexer;
LANGLE: '<' -> pushMode(tag);
NOANGLE: ~[<>]+;
BADRANGLE: '>';
mode tag;
RANGLE: '>' -> popMode;
...
然后 >
标记外的内容在解析期间将失败。
在 <
或 >
以符合有效的标记语法。如果尖括号不是有效标记的一部分,则应将其转义为 <
或 >
。我正在寻找的语法是 <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 < 2
当我使用 BailErrorStrategy
时,它也成功地失败了以下:
<foo123>
<bar#a>
<foo#123H>
<unsupported#123>
if 1 < 2
最后一个成功失败,因为 <
进入 tag
模式并且它与支持的标签格式不匹配。但是,我也想避免在文本中出现 >
的实例,因此以下内容也应该失败:
if 2 > 1
该文本应指定为 if 2 > 1
而不是原始尖括号。
我如何修改语法,使不属于有效标记的 >
的出现无法解析?
按照您现在的语法,它会在标记识别错误的标记之外失败 >
,因为 >
没有出现在 tag
之外的词法分析器语法中模式。这是一个失败,好吧,因为它是。但是如果你坚持在 parse 期间失败,那么只需将直角添加到词法分析器的默认模式:
lexer grammar TagsLexer;
LANGLE: '<' -> pushMode(tag);
NOANGLE: ~[<>]+;
BADRANGLE: '>';
mode tag;
RANGLE: '>' -> popMode;
...
然后 >
标记外的内容在解析期间将失败。