Antlr4语法无法解析

Antlr4语法无法解析,antlr4,Antlr4,我是ANTLR的新手,下面是我正在研究的一个语法,对于给定的输入字符串-a.B()&((C.D()| E.F())它失败了 我尝试了许多组合,但在同一个地方失败了 grammar Expressions; expression : logicBlock (logicalConnector logicBlock)* | NOT? '('? logicB

我是ANTLR的新手,下面是我正在研究的一个语法,对于给定的输入字符串-a.B()&((C.D()| E.F())它失败了

我尝试了许多组合,但在同一个地方失败了

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。想知道是否有任何代码片段也能做到这一点。