我一直在研究用 ANTLR 解析键值数据格式。非常简单,但键代表层次结构。
我的输入语法的简化示例:
/a/b/c=2
/a/b/d/e=3
/a/b/d/f=4
在我看来,这代表一棵结构如下的树:
(a (b (= c 2) (d (= e 3) (= f 4))))
我能得到的最接近的是使用以下语法:
/* Parser Rules */
start: (component NEWLINE?)* EOF -> (component)*;
component: FORWARD_SLASH ALPHA_STRING component -> ^(ALPHA_STRING component)
| FORWARD_SLASH ALPHA_STRING EQUALS value -> ^(EQUALS ALPHA_STRING value);
value: ALPHA_STRING;
/* Lexer Rules */
NEWLINE : '\r'? '\n';
ALPHA_STRING : ('a'..'z'|'A'..'Z'|'0'..'9')+;
EQUALS : '=';
FORWARD_SLASH : '/';
产生:
(a (b (= c 2))) (a (b (d (= e 3)))) (a (b (d (= f 4))))
我不确定我是否对像 ANTLR 这样的通用工具提出了太多要求,这是我可以通过这种方法得到的。也就是说,从这里我使用树的各个部分并手动创建我想要的数据结构。
那么 - 我可以直接从语法中生成我想要的树结构吗?如果是这样,怎么做?如果不是,为什么不呢 - 它是 ANTLR 的技术限制,还是与所涉及的语言类型有关?