我正在尝试解析以下文本格式:
<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 : [ \t\r\n]+ -> 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
,但我还没有找到解决方案。)
答案 0 :(得分:0)
你总是可以让词法分析器规则化最小量并且有一些解析器规则而不是词法分析器规则来表示你想要的任何组合。让我们说:
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;