antlr4-解析`任何弦乐',而无需消耗整个输入



我正在尝试解析以下文本格式:

<identifier> {
    <identifier> : <any-text-without-white-space-or-new-line> : <identifier>
    <identifier> : <identifier>.<identifier>
}

例如:

john {
    name : JohnJohnson.12.453.643-USA[NewYork] : default
    reference : something.else
}

我创建了以下语法:

SPACE          : [ trn]+ -> skip;
LEFT_BRACE     : '{';
RIGHT_BRACE    : '}';
COLON          : ':';
DOT            : '.';
ID             : [a-z]+
ANY            : ~(' '|'t'|'r'|'n')+;
outer          : ID LEFT_BRACE inner_first inner_second RIGHT_BRACE EOF;
inner_first    : ID COLON (ANY | ID) COLON ID;
inner_second   : ID COLON ID DOT ID;

此语法的问题是第二行输入中的<identifier>.<identifier>被认为是

ANY

而不是

ID DOT ID

如果将ANY的定义更改为:

,我可以解决此问题。
ANY            : ~(' '|'t'|'r'|'n'|'.')+;

这意味着.符号不能再成为第一行中任意文本的一部分。

这似乎是鸡/鸡蛋问题。这可以解决吗?

(fwiw,我正在阅读一本好书The Definitive ANTLR 4 Reference,但我之前购买了,但我还没有找到解决方案。)

您始终可以拥有Lexer规则的最低数量,并具有一些解析器规则,而不是Lexer规则,以表示您想要的任何东西的组合。假设:

my_desired_seq     : NON_WS_CRLF_DOT_SEQ  DOT NON_WS_CRLF_DOT_SEQ  ;
NON_WS_CRLF_DOT_SEQ      : ~(' '|'t'|'r'|'n'|'.')+;

和语法的其他部分使用解析器规则:

inner_second   : ID COLON my_desired_seq;

相关内容

  • 没有找到相关文章

最新更新