Tree ANTR3条件树重写

Tree ANTR3条件树重写,tree,antlr,grammar,Tree,Antlr,Grammar,堆栈溢出 继续我的Antlr之旅(前面的问题可能会提供更多关于我想要实现什么的线索!而且)我遇到了另一个我无法克服的障碍 基本上(我相信)我语法中的表达式规则需要根据它匹配的数据类型的数量创建一个新的根节点。我举了一个例子来最好地描述我的意思: 考虑到以下输入: ComplexFunction(id="Test" args:[1, 25 + 9 + 8, true, [1,2,3]]) 我得到这棵树: 供参考-正确解析的“args”数组中的第一个元素。而数组“args”中的第二个元素“25+

堆栈溢出

继续我的Antlr之旅(前面的问题可能会提供更多关于我想要实现什么的线索!而且)我遇到了另一个我无法克服的障碍

基本上(我相信)我语法中的
表达式
规则需要根据它匹配的
数据类型的数量创建一个新的根节点。我举了一个例子来最好地描述我的意思:

考虑到以下输入:

ComplexFunction(id="Test" args:[1, 25 + 9 + 8, true, [1,2,3]])
我得到这棵树:

供参考-正确解析的“args”数组中的第一个元素。而数组“args”中的第二个元素“25+9+8”没有。它似乎只匹配表达式的最后两部分(9+8)

我试图让数组的第二个元素成为一个
表达式
节点,包含3个子元素25、9和8)

我真的被卡住了,需要你(再次)的帮助。谢谢您的时间:)

以下是我的语法,仅供参考:

grammar Test;

options {output=AST;ASTLabelType=CommonTree;}
tokens {FUNCTION; NAME; ATTRIBUTES; ATTRIBUTE; VALUE; CHILDREN; EXPRESSION;}

program  : function ;
function :  ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)? SEMICOLON? -> ^(FUNCTION ^(NAME ID) ^(ATTRIBUTES attribute*) ^(CHILDREN function*)) ;

attribute : ID (COLON | EQUALS) expression -> ^(ATTRIBUTE ^(NAME ID) ^(VALUE expression));

expression : datatype (PLUS datatype)* -> datatype ^(EXPRESSION datatype+)?;

datatype : ID  ->  ^(STRING["ID"] ID)
   | NUMBER -> ^(STRING["NUMBER"] NUMBER)
   |  STRING  -> ^(STRING["STRING"] STRING)
   |   BOOLEAN ->  ^(STRING["BOOLEAN"] BOOLEAN)
   |   array -> ^(STRING["ARRAY"] array)
   |   lookup  ->  ^(STRING["LOOKUP"] lookup) ;

array  :  OPEN_BOX (expression (COMMA expression)*)? CLOSE_BOX -> expression* ;

lookup  : OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE -> ID* ;

NUMBER
 : ('+' | '-')? (INTEGER | FLOAT)
 ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

BOOLEAN
 : 'true' | 'TRUE' | 'false' | 'FALSE'
 ;

ID  : (LETTER|'_') (LETTER | INTEGER |'_')*
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WHITESPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

COLON : ':' ;
SEMICOLON : ';' ;

COMMA : ',' ;
PERIOD  :  '.' ;
PLUS : '+' ;
EQUALS : '=' ; 

OPEN_BRACKET : '(' ;
CLOSE_BRACKET : ')' ;

OPEN_BRACE : '{' ; 
CLOSE_BRACE : '}' ;

OPEN_BOX : '[' ;
CLOSE_BOX : ']' ;

fragment
LETTER
 : 'a'..'z' | 'A'..'Z' 
 ;

fragment
INTEGER
 : '0'..'9'+
 ;

fragment
FLOAT
 : INTEGER+ '.' INTEGER*
 ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    ;

哈哈!我想我明白了!如果其他人有类似问题,请查看我的新语法:

grammar Test;

options {output=AST;ASTLabelType=CommonTree;}
tokens {FUNCTION; ATTRIBUTES; ATTRIBUTE; VALUE; CHILDREN; EXPRESSION;}

@parser::members { int dataTypeCount = 0; }

program     :   function ;
function    :   ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)? SEMICOLON? -> ^(FUNCTION ^(ID["ID"] ID) ^(ATTRIBUTES attribute*) ^(CHILDREN function*)) ;

attribute   :   ID (COLON | EQUALS) expression -> ^(ATTRIBUTE ^(ID["ID"] ID) ^(VALUE expression));

expression  :   datatype {dataTypeCount = 1;} (PLUS datatype {dataTypeCount++;})*   
                -> {dataTypeCount == 1}? datatype*
                -> ^(EXPRESSION datatype*) ;    

datatype    :   ID      ->  ^(STRING["ID"] ID)
            |   NUMBER  ->  ^(STRING["NUMBER"] NUMBER)
            |   STRING  ->  ^(STRING["STRING"] STRING)
            |   BOOLEAN ->  ^(STRING["BOOLEAN"] BOOLEAN)
            |   array   ->  ^(STRING["ARRAY"] array)
            |   lookup  ->  ^(STRING["LOOKUP"] lookup) ;

array       :   OPEN_BOX (expression (COMMA expression)*)? CLOSE_BOX -> expression* ;

lookup      :   OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE -> ID* ;

NUMBER
    :   ('+' | '-')? (INTEGER | FLOAT)
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

BOOLEAN
    :   'true' | 'TRUE' | 'false' | 'FALSE'
    ;

ID  :   (LETTER|'_') (LETTER | INTEGER |'_')*
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WHITESPACE  :   (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;

COLON   :   ':' ;
SEMICOLON   :   ';' ;

COMMA   :   ',' ;
PERIOD  :   '.' ;
PLUS    :   '+' ;
EQUALS  :   '=' ;   

OPEN_BRACKET    :   '(' ;
CLOSE_BRACKET   :   ')' ;

OPEN_BRACE  :   '{' ;   
CLOSE_BRACE :   '}' ;

OPEN_BOX    :   '[' ;
CLOSE_BOX   :   ']' ;

fragment
LETTER
    :   'a'..'z' | 'A'..'Z' 
    ;

fragment
INTEGER
    :   '0'..'9'+
    ;

fragment
FLOAT
    :   INTEGER+ '.' INTEGER*
    ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    ;