Antlr4语法无法解析
我是ANTLR的新手,下面是我正在研究的一个语法,对于给定的输入字符串-a.B()&((C.D()| E.F())它失败了 我尝试了许多组合,但在同一个地方失败了Antlr4语法无法解析,antlr4,Antlr4,我是ANTLR的新手,下面是我正在研究的一个语法,对于给定的输入字符串-a.B()&((C.D()| E.F())它失败了 我尝试了许多组合,但在同一个地方失败了 grammar Expressions; expression : logicBlock (logicalConnector logicBlock)* | NOT? '('? logicB
grammar Expressions;
expression
: logicBlock (logicalConnector logicBlock)*
| NOT? '('? logicBlock ')'? (logicalConnector NOT? '('? logicBlock ')'?)*
;
logicBlock
: logicUnit comparator THINGS
| logicUnit comparator logicUnit
| logicUnit
;
logicUnit
: NOT? '(' method ')'
| NOT? method
;
method
: object '.' function ('.' function)*
;
object
: THINGS
|'(' THINGS ')'
;
function
: THINGS '(' arguments? ')'
;
arguments
: (object | function | method | logicUnit | logicBlock)
(
','
(object | function | method | logicUnit | logicBlock)
)*
;
logicalConnector
: AND | OR | PLUS | MINUS
;
comparator
: GT | LT | GTE | LTE | EQUALS | NOTEQUALS
;
AND : '&&' ;
OR : '||' ;
EQUALS : '==' ;
ASSIGN : '=' ;
GT : '>' ;
LT : '<' ;
GTE : '>=' ;
LTE : '<=' ;
NOTEQUALS : '!=' ;
NOT : '!' ;
PLUS : '+' ;
MINUS : '-' ;
IF : 'if' ;
THINGS
: [a-zA-Z] [a-zA-Z0-9]*
| '"' .*? '"'
| [0-9]+
| ([0-9]+)? '.' ([0-9])+
;
WS : [ \t\r\n]+ -> skip
;
语法表达式;
表情
:logicBlock(logicalConnector logicBlock)*
|不是吗?”(“?逻辑块”)?(逻辑连接器不是?'('logicBlock')'?)*
;
逻辑块
:逻辑单元比较器
|逻辑单元比较器逻辑单元
|逻辑单元
;
逻辑单元
:不是吗(‘方法’)'
|不是吗?方法
;
方法
:对象“.”函数(“.”函数)*
;
对象
:事物
|“(‘事物’)”
;
功能
:THINGS'(“arguments?”)'
;
论据
:(对象|函数|方法|逻辑单元|逻辑块)
(
','
(对象|函数|方法|逻辑单元|逻辑块)
)*
;
逻辑连接器
:和|或|加|减
;
比较器
:GT | LT | GTE | LTE |等于| NOTEQUALS
;
及:"&";
或:“| |”;
等于:'=';
分配:'=';
GT:“>”;
LT:'=';
LTE:“我觉得这个规则很奇怪:
expression
: logicBlock (logicalConnector logicBlock)*
| NOT? '('? logicBlock ')'? (logicalConnector NOT? '('? logicBlock ')'?)*
// ^ ^ ^ ^
// | | | |
;
所有可选的括号都不可能正确:这意味着第一个括号可以出现,而其他3个括号将被省略(以及任何其他组合),从而使表达式中的括号不平衡
要使语法在输入A.B()&((C.D()| E.F())
中工作,您需要执行以下操作:
expression
: logicBlock (logicalConnector logicBlock)*
| NOT? logicBlock (logicalConnector NOT? logicBlock)*
;
logicBlock
: '(' expression ')'
| logicUnit comparator THINGS
| logicUnit comparator logicUnit
| logicUnit
;
logicUnit
: '(' expression ')'
| NOT? '(' method ')'
| NOT? method
;
expression
: '(' expression ')'
| NOT expression
| expression comparator expression
| expression logicalConnector expression
| method
| object
| THINGS
;
method
: object '.' function ( '.' function )*
;
object
: THINGS
|'(' THINGS ')'
;
function
: THINGS '(' arguments? ')'
;
arguments
: expression ( ',' expression )*
;
logicalConnector
: AND | OR | PLUS | MINUS
;
comparator
: GT | LT | GTE | LTE | EQUALS | NOTEQUALS
;
但是ANTLR4支持左递归规则,允许您像这样定义表达式规则:
expression
: logicBlock (logicalConnector logicBlock)*
| NOT? logicBlock (logicalConnector NOT? logicBlock)*
;
logicBlock
: '(' expression ')'
| logicUnit comparator THINGS
| logicUnit comparator logicUnit
| logicUnit
;
logicUnit
: '(' expression ')'
| NOT? '(' method ')'
| NOT? method
;
expression
: '(' expression ')'
| NOT expression
| expression comparator expression
| expression logicalConnector expression
| method
| object
| THINGS
;
method
: object '.' function ( '.' function )*
;
object
: THINGS
|'(' THINGS ')'
;
function
: THINGS '(' arguments? ')'
;
arguments
: expression ( ',' expression )*
;
logicalConnector
: AND | OR | PLUS | MINUS
;
comparator
: GT | LT | GTE | LTE | EQUALS | NOTEQUALS
;
让它更具可读性。当然,它不会生成与原始语法生成的解析树完全相同的解析树,但在这方面您可能会灵活一些。这个建议的语法也比你的更匹配:比如不是一个,你的语法不允许,而我建议的语法接受它。谢谢Bart K。我尝试了几个组合,效果很好。我的初衷是指定logicalConnector(和或加减)。这就是为什么我要介绍logicBlock和logicUnit。但是,对于新语法,我需要执行多次传递,直到“expression”规则的input==output。想知道是否有任何代码片段也能做到这一点。