ANTLR4语法指定父子关系

时间:2014-12-29 15:59:42

标签: parsing antlr antlr4

我创建了一个语法,使用ANTLR4语法文件使用键和值对通过Map表示搜索:

START: 'SEARCH FOR';
VALUE_EXPRESSION: 'VALUE:'[a-zA-Z0-9]+;
MATCH: 'MATCHING';
COMMA: ',';
KEY_EXPRESSION: 'KEY:'[a-zA-Z0-9]*; 
KEY_VALUE_PAIR: KEY_EXPRESSION MATCH VALUE_EXPRESSION;
r : START KEY_VALUE_PAIR (COMMA KEY_VALUE_PAIR)*;
WS: [ \n\t\r]+ -> skip;

"解释Lexer"在ANTLRWorks中产生:

enter image description here

" Parse Tree"像这样:

enter image description here

我不确定这是解析输入字符串的正确(甚至是典型)方式,但我想做的是将每个键/值对分开并且放在父节点下,如:

[SEARCH FOR] [PAIR],     [PAIR]
                |           |
               / \         / \
              /   \       /   \
             /     \     /     \
         colour    red size   small

我的信念是,在这样做时,当我走到树上时会更容易。

我已经四处搜索并尝试使用插入符号' ^'用于指定父级的字符,但ANTLRWorks始终表示我的语法中存在错误。

任何人都可以帮忙解决这个问题,或者可能提供另一种解决方案(如果这是一种非典型方法)?

1 个答案:

答案 0 :(得分:0)

您可以进一步简化此操作。您可能希望为密钥设置LEXER规则以跟踪它们。所以下面,我只是使用字符串作为关键。但是你可以为'颜色','大小'等定义一个词法分析器规则......而且,我取消了匹配。相反,我创建了一组对。

grammar GRAMMAR;

start: START set ;

set
    :   pair (',' pair)*
    ;

pair:   STRING ':' value ;

value
    :   STRING
    |   NUMBER
    ;

START: 'SEARCH FOR: ' ;
STRING :  '"' [a-zA-Z_0-9]* '"' ;

NUMBER
    :   '-'? INT '.' [0-9]+ EXP? // 1.35, 1.35E-9, 0.3, -4.5
    |   '-'? INT EXP             // 1e10 -3e4
    |   '-'? INT                 // -3, 45
    ;

fragment INT :   '0' | [1-9] [0-9]* ; // no leading zeros
fragment EXP :   [Ee] [+\-]? INT ; // \- since - means "range" inside [...]

WS  :   [ \t\n\r]+ -> skip ;