我想为下面的文件结构创建一个 ANTLR 语法,
kinds
name test_val_1
length ten test_val_2
uses
use1 testcase_1
use2 testcase_2
在上面的示例中,结构“kinds”应该是解析树中的根节点。 'name'、'length' 和 'uses' 是 'kinds' 的子节点。 “kinds”之后直到到达新空行的第一个单词应该是“kinds”的子节点。
空行之后的单个单词也应该是“kinds”的子节点,但是该单个单词之后直到到达空行的每行的第一个单词应该是该特定单词的子节点。 例如:'use1'和'use2'应该是上例中'uses'的子节点。
对于每一行,第一个单词后面用空格分隔的单词应该是该特定单词的子节点。 例如1:'test_val_1'必须是'name'的子节点。 例如2:'ten'和'test_val_2'必须是节点'length'的子节点。 “uses”之后的行也是如此。
我尝试使用的语法添加在下面,但节点没有按预期嵌套。
grammar Test;
test : entry (NEWLINE+ entry)* NEWLINE* EOF;
entry : label;
label : KEY_OR_VALUE (SPACE value)*;
nestedEntry : label;
value : KEY_OR_VALUE+;
KEY_OR_VALUE : [a-zA-Z_]+[a-zA-Z_0-9.]*;
SPACE : [ ]+;
NEWLINE : [\r\n]+;
预期解析树结果如下:
- kinds should be the root node under which the child nodes are name, length and uses
- name should have another child node having the value separated by a space after name, in the example that will be test_val_1
- length node should have two child nodes, that are ten and test_val_2 in the above example
- uses should have two child nodes, that are use1 and use2 which in turn will have the child nodes testcase_1 and testcase_2 respectively.
如您所见,解析树没有按预期出现。
对我的语法需要修正什么有什么建议吗?
如果我理解正确的话,“根”始终是文件的第一行,并且它可以有 3 种子级(直接和间接)。
ten
和 test_val_1
,它们位于空格之后。我在下面称之为child3
name
和length
,它们在换行之后。我在下面将这些称为 child2
。这些是 child3
的父母,并且可以是根uses
,在2个新行之后。我在下面将这些称为 child1
。这些是 child2
的父母,并且可以是根的孩子。test: KEY_OR_VALUE (NEWLINE child2)+ (NEWLINE NEWLINE child1)+;
child1: KEY_OR_VALUE (NEWLINE child2)+;
child2: KEY_OR_VALUE (SPACE child3)*;
child3: KEY_OR_VALUE;