为什么结尾括号在我的antlr4语法中无效?

为什么结尾括号在我的antlr4语法中无效?,antlr4,Antlr4,我正在用ANTLR4编写一个DSL,现在我有一个右括号结尾的问题。为什么这个命令无效 这是命令: set(buffer,variableX|"foo"); 包含错误的解析树 这是我的语法 grammar Expr; prog: expr+ EOF; expr: statement #StatementExpr

我正在用ANTLR4编写一个DSL,现在我有一个右括号结尾的问题。为什么这个命令无效

这是命令:

set(buffer,variableX|"foo");
包含错误的解析树

这是我的语法

        grammar Expr;
        
        prog: expr+ EOF;
        expr:
                     statement                     #StatementExpr
                     |NOT expr                         #NotExpr
                     | expr AND expr                #AndExpr
                     | expr (OR | XOR) expr         #OrExpr
                     | function                             #FunctionExpr
                     | LPAREN expr RPAREN       #ParenExpr
                     | writeCommand              #WriteExpr
         ;
        
        writeCommand: setCommand | setIfCommand;
        statement: ID '=' getCommand  NEWLINE         #Assign;
        setCommand: 'set' LPAREN variableType '|' parameter RPAREN SEMI;
        setIfCommand: 'setIf' LPAREN variableType '|' expr '?' parameter ':' parameter RPAREN SEMI;
        
        getCommand: getFieldValue | getInstanceAttribValue|getInstanceAttribValue|getFormAttribValue|getMandatorAttribValue;
        getFieldValue: 'getFieldValue' LPAREN instanceID=ID COMMA fieldname=ID RPAREN;
        getInstanceAttribValue: 'getInstanceAttrib' LPAREN instanceId=ID COMMA moduleId=ID COMMA attribname=ID RPAREN;
        getFormAttribValue: 'getFormAttrib' LPAREN formId=ID COMMA moduleId=ID COMMA attribname=ID RPAREN;
        getMandatorAttribValue: 'getMandatorAttrib' LPAREN mandator=ID COMMA moduleId=ID COMMA attribname=ID RPAREN;
        
        twoParameterList: parameter '|' parameter;
        parameter:variableType | constType;
        pdixFuncton:ID;
        constType:
                        ID
                        | '"'  ID '"';
        variableType:
                            valueType
                            |instanceType
                            |formType
                            |bufferType
                            |instanceAttribType
                            |formAttribType
                            |mandatorAttribType
                            ;
        valueType:'value' COMMA parameter (COMMA functionParameter)?;
        instanceType: 'instance' COMMA instanceParameter;
        formType: 'form' COMMA formParameter;
        bufferType: 'buffer' COMMA ID '|' parameter;
        instanceParameter: 'instanceId'
                                        | 'instanceKey'
                                        | 'firstpenId'
                                        | 'lastpenId'
                                        | 'lastUpdate'
                                        | 'started'
                                        ;
        formParameter: 'formId'
                                    |'formKey'
                                    |'lastUpdate'
                                    ;
        functionParameter: 'lastPen'
                                        | 'fieldGroup'
                                        | ' fieldType'
                                        | 'fieldSource'
                                        | 'updateId'
                                        | 'sessionId'
                                        | 'icrConfidence'
                                        | 'icrRecognition'
                                        |  'lastUpdate';
        
        instanceAttribType:('instattrib' | 'instanceattrib') COMMA attributeType;
        formAttribType:'formattrib' COMMA attributeType;
        mandatorAttribType: 'mandatorattrib' COMMA attributeType;
        attributeType:ID '#' ID;
        
         function:
                        commandIsSet            #IsSet
                        | commandIsEmpty    #IsEmpty
                        | commandIsEqual  #IsEqual
                        ;
        commandIsSet: IS_SET LPAREN parameter RPAREN;
        commandIsEmpty: IS_EMPTY LPAREN parameter RPAREN;
        commandIsEqual: IS_EQUAL LPAREN twoParameterList RPAREN;
        
        LPAREN : '(';
        RPAREN : ')';
        LBRACE : '{';
        RBRACE : '}';
        LBRACK : '[';
        RBRACK : ']';
        SEMI : ';';
        COMMA : ',';
        DOT : '.';
        ASSIGN : '=';
        GT : '>';
        LT : '<';
        BANG : '!';
        TILDE : '~';
        QUESTION : '?';
        COLON : ':';
        EQUAL : '==';
        LE : '<=';
        GE : '>=';
        NOTEQUAL : '!=';
        AND : 'and';
        OR : 'or';
        XOR :'xor';
        NOT :'not'  ;
        INC : '++';
        DEC : '--';
        ADD : '+';
        SUB : '-';
        MUL : '*';
        DIV : '/';
        
        INT: [0-9]+;
        NEWLINE: '\r'? '\n';
        IS_SET:'isSet';
        IS_EMPTY:'isEmpty';
        IS_EQUAL:'isEqual';
        WS: (' '|'\t' | '\n' | '\r' )+ -> skip;
        
        ID
        :   JavaLetter JavaLetterOrDigit*
        ;
        
        fragment
        JavaLetter
        :   [a-zA-Z$_] // these are the "java letters" below 0xFF
        |   // covers all characters above 0xFF which are not a surrogate
            ~[\u0000-\u00FF\uD800-\uDBFF]
            {Character.isJavaIdentifierStart(_input.LA(-1))}?
        |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
            [\uD800-\uDBFF] [\uDC00-\uDFFF]
            {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
        ;
        
        fragment
        JavaLetterOrDigit
        :   [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
        |   // covers all characters above 0xFF which are not a surrogate
            ~[\u0000-\u00FF\uD800-\uDBFF]
            {Character.isJavaIdentifierPart(_input.LA(-1))}?
        |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
            [\uD800-\uDBFF] [\uDC00-\uDFFF]
            {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
        ;
        fragment DoubleQuote: '"' ;   // Hard to read otherwise.
语法表达式;
程序:expr+EOF;
表达式:
语句#语句表达式
|非expr#NotExpr
|expr和expr#AndExpr
|expr(或| XOR)expr#OrExpr
|函数#函数表达式
|LPAREN expr RPAREN#ParenExpr
|writeCommand#WriteExpr
;
writeCommand:setCommand | setIfCommand;
语句:ID'='getCommand换行符#Assign;
setCommand:'set'LPAREN variableType'|'参数RPAREN;
setIfCommand:'setIf'LPAREN variableType'|'expr'?'parameter':'parameter RPAREN;
getCommand:getFieldValue | GetInstanceAttributeValue | GetInstanceAttributeValue | getFormAttribValue | GetMandatorAttributeValue;
getFieldValue:'getFieldValue'LPAREN instanceID=ID逗号fieldname=ID RPAREN;
getInstanceAttribValue:'getInstanceAttrib'LPAREN instanceId=ID逗号模块ID=ID逗号属性名称=ID RPAREN;
getFormAttribValue:'getFormAttrib'LPAREN formId=ID COMMA moduleId=ID COMMA attribname=ID RPAREN;
getMandatorAttribValue:'getMandatorAttrib'LPAREN mandator=ID逗号模块ID=ID逗号属性名=ID RPAREN;
twoParameterList:参数“|”参数;
参数:variableType | constType;
pdixfuncon:ID;
常数类型:
身份证件
|“‘ID’”;
可变类型:
值类型
|实例类型
|模板
|缓冲类型
|InstanceAttributeType
|formAttribType
|MandatoratribType
;
valueType:'value'逗号参数(逗号函数参数)?;
instanceType:“instance”逗号instanceParameter;
formType:“form”逗号formParameter;
bufferType:'buffer'逗号ID'|'参数;
instanceParameter:'instanceId'
|“instanceKey”
|“第一杯”
|“最后一次开放”
|“最新更新”
|“开始”
;
formParameter:'formId'
|“formKey”
|“最新更新”
;
functionParameter:'lastPen'
|“现场小组”
|“字段类型”
|“字段源”
|“更新ID”
|“sessionId”
|“信心”
|“ICR认可”
|“最新更新”;
instanceAttribType:('instattrib'|'instanceattrib')逗号属性类型;
formAttribType:'formattrib'逗号属性类型;
mandatorAttribType:'mandatorattrib'逗号属性类型;
attributeType:ID'#'ID;
功能:
命令集#命令集
|命令是空的
|命令相等
;
commandIsSet:IS_SET LPAREN参数RPAREN;
commandIsEmpty:LPAREN参数RPAREN为空;
commandIsEqual:IS_等于LPAREN twoParameterList RPAREN;
LPAREN:'(';
RPAREN:')';
LBRACE:“{”;
RBRACE:'}';
LBRACK:'[';
RBRACK:']';
半:';';
逗号:',';
点:';
分配:'=';
GT:“>”;
LT:“输入
设置(缓冲区,变量x |“foo”)无法通过以下方式进行分析:

setCommand: 'set' LPAREN variableType '|' parameter RPAREN SEMI;
由于
缓冲区,variableX |“foo”
将通过以下方式进行匹配:

bufferType: 'buffer' COMMA ID '|' parameter;

这会导致
setCommand
中的
“|”参数
无法匹配任何内容。如果输入类似于
set(buffer,variableX |“foo”|“bar”),它将成功解析。或者从
setCommand
规则或
bufferType
规则中删除
“|”参数

bufferType
规则定义与
setCommand
规则冲突:两者都需要匹配
“|”参数
,但源输入仅包含一个
“foo”
。因此,问题是,
bufferType
规则是否应该有一个必需的
“|”参数
?这确实使得它的定义相对于另一个
variableType
s是唯一的。谢谢,这有助于再次感谢您的详细回答,我可以用它来解决这个问题