Antrl3条件树重写 [英] Antrl3 conditional tree rewrites
问题描述
Stackoverflow.
Stackoverflow.
继续我进入Antlr的旅程(先前的问题可能会提供有关我要实现的目标的其他线索!第二季度-解决了LL递归问题)我遇到了又一个无法解决的障碍.
Continuing on my journey into Antlr (Previous questions may provide additional clues on what I'm trying to achieve! Q1 - How do I make a tree parser and Q2 - Solving LL recursion problem) I've hit yet another roadblock I cannot flathom.
基本上(我认为)我语法中的expression
规则需要根据匹配的datatype
的数量创建一个新的根节点.我整理了一个示例,以尽力描述我的意思:
Basically (I believe) the expression
rule in my grammar needs to either create a new root node depending on the number of datatype
s it has matched. I have put together an example to try best describe what I mean:
给出以下输入:
ComplexFunction(id="Test" args:[1, 25 + 9 + 8, true, [1,2,3]])
我得到这棵树:
供参考-正确解析"args"数组中的第一个元素.而数组"args""25 + 9 + 8"中的第二个元素则没有.它似乎只匹配表达式的最后2个部分(9 + 8).
For reference - The first element in the "args" array as been correctly parsed. Whereas the 2nd element in the array "args" '25 + 9 + 8' has not. It appears to only match the last 2 parts of the expression (9 + 8).
我正试图使数组的第二个元素成为EXPRESSION
节点,并带有3个孩子25、9和8).
I'm trying to get the 2nd element of the array to be an EXPRESSION
node, with the 3 children 25, 9, and 8).
老实说,我被困住了,需要您的帮助(再次).谢谢您的时间:)
I'm honestly stuck and need your help (Again). Thanks for your time :)
作为参考,这是我的语法:
For reference, here is my grammar:
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'|'\"'|'\''|'\\')
;
推荐答案
哈哈!我想我明白了!如果还有其他人遇到类似的问题,请查看我的新语法:
Haha! I think I got it! If anyone else has a similar problem take a look at my new grammar:
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'|'\"'|'\''|'\\')
;
这篇关于Antrl3条件树重写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!