gpt4 book ai didi

tree - Antrl3条件树重写

转载 作者:行者123 更新时间:2023-12-04 23:57:26 24 4
gpt4 key购买 nike

计算器。

继续我的 Antlr 之旅(之前的问题可能会提供更多关于我想要实现的目标的线索!Q1 - How do I make a tree parserQ2 - Solving LL recursion problem)我遇到了另一个我无法理解的障碍。

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

给定以下输入:

ComplexFunction(id="Test" args:[1, 25 + 9 + 8, true, [1,2,3]])

我得到这棵树:

http://img25.imageshack.us/img25/2273/treeka.png

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

我试图让数组的第二个元素成为一个 EXPRESSION 节点,其中有 3 个 child 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'|'\"'|'\''|'\\')
;

关于tree - Antrl3条件树重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com