Antlr获取不匹配的输入';(';期望';(';异常

Antlr获取不匹配的输入';(';期望';(';异常,antlr,Antlr,我正试图为以下语句编写Antlr语法: data (DROP=hello); 我的Antlr语法是: DATA '(' DROP EQUAL 'hello' ')' ';' 不确定我在这里遗漏了什么。我的测试声明是: Data File1(compress=char REUSE=YES); 主语法文件: 语法分析; 导入通用语法、数据TMT /*NOTE: When i execute my grammar on data_stmt it works fine but on Pars

我正试图为以下语句编写Antlr语法:

data (DROP=hello);
我的Antlr语法是:

DATA '(' DROP EQUAL 'hello' ')' ';'
不确定我在这里遗漏了什么。我的测试声明是:

Data File1(compress=char REUSE=YES);
  • 主语法文件:

    语法分析; 导入通用语法、数据TMT

       /*NOTE: When i execute my grammar on data_stmt it works fine but on Parse level it fails*/
    
        parse
         : (data_stmt
          )*EOF
        ; 
        /*** End of Parse Grammar
    
  • 下面的DataStmt语法是直接解析datastatement

  • 数据语句语法文件:

        grammar DataStmt;
        import CommonGrammar;
    
        parse
         : (data_stmt)* EOF
         ;
    
        data_stmt
         : DATA ';'
         | DATA Tk_NULL datastmt_cmd? NOLIST? ';' 
         | DATA dataset_name_opt+ datastmt_cmd? NOLIST? ';'
         | DATA view_dsname_opt+ '/' VIEW '=' view_name passwd_opt? source_opt? NESTING? NOLIST? ';'
         | DATA dataset_name '/' PGM '=' program_name passwd_opt? source_opt? NESTING? NOLIST? ';'
         | DATA VIEW '=' view_name passwd_opt? NOLIST? ';'
         | DATA PGM '=' program_name passwd_opt? NOLIST? ';'
         ;
    
        dataset_name_opt
         : dataset_name ('(' variables '=' (~('('|')'))*? ')')?
         ;
    
        datastmt_cmd
         : '/' DEBUG? NESTING? (STACK '=' INT)?
         ;
    
         // view-name <data-set-name-1 <(data-set-options-1)>>
        view_dsname_opt
         : variables variables? ('(' variables '=' (~('('|')'))*? ')')?
         ;
    
        view_name : variables  ;
        dataset_name : variables;
        program_name : variables;
        passwd_opt  : '(' (ALTER|READ|PW) '=' (~('('|')'))*? ')' ;
        source_opt : ('(' SOURCE '=' (SAVE | ENCRYPT | NOSAVE) ')') ;
    
  • 当我在DataStatement级别执行语法时,它在文件中起作用,但当我在Parse级别执行语法时,它会说:

    ParseSAS::parse:1:10:输入“数据文件1”时没有可行的替代方案('


    当您有一个与此输入匹配的lexer规则,并且在解析器规则中对同一输入使用字符串文字时,通常会出现此错误。请不要这样做。请始终在lexer规则中定义lexer输入,并且不要在解析器规则中使用字符串文字


    更新:上传语法后,我发现您的文字几乎没有lexer规则。您当然应该重新构造语法,并将所有文字移到一个通用的lexer语法中。

    请展示您的整个语法。我很乐意看一看,包括完整的语法、您的测试输入和预期结果。我刚刚创建了所有三个语法文件,并在ParseSAS上运行了ANTLR4工具,屏幕上出现了大量错误错误。有点不对劲,我无法从中重现您的错误。我是否可以将源文件附加到这里,而不是复制粘贴内容?请稍候。是哪一个?
    数据(DROP=hello);
    数据文件1(compress=char REUSE=YES);
        CommonGrammar.g4:
    
        grammar CommonGrammar;
    
        expression
         : literal
         | Identifier
         | DOT
         | OUTPUT Identifier?
         | '(' expression ')'
         | expression '(' expressionList? ')'
         | expression '{' expression '}'
         | expression '[' expression ']'
         | NOT expression
         | expression MIN expression
         | expression MAX expression
         | expression ('*'|'/'|'%') expression
         | expression ('+'|'-') expression
         | expression ('||' | '!!' ) expression
         | expression (EQ | NE | GT | LT | GE | LE | EQUAL ) expression
         | expression (EQC | NEC | GTC | LTC | GEC | LEC ) expression
         | expression (IN | INColon| NOT IN) in_var_list
         | expression (AND | OR ) expression
         | LIST
         ;
        expressionList 
         : (expression | of_var_list) (',' (expression|of_var_list))*
         | expressionList ','+ expressionList
         ;
    
        of_var_list 
         : 'of' (Identifier '-' Identifier) ((COMMA 'of')? (Identifier '-' Identifier) )*
         | 'of' Identifier Identifier*
         | 'of' Identifier '[' '*' ']'
         ;
        identifiers_list
         : (Identifier | Identifier '-' Identifier |Identifier ',' Identifier ','Identifier)+
         ;
    
        in_var_list
         : Identifier
         | '(' (literal|colonInts) (',' (literal|colonInts))* ')'
         ;
        colonInts
         : INT ':' INT
         ;
    
        literal
         : INT
         | FloatingPointLiteral
         | STRINGLITERAL
         | DateLiteral
         | TimeLiteral
         | DateTimeLiteral
         | BitLiteral
         | NameLiteral
         | HexLiteral
         | DOT
         ;
    
        variables
         : variables DOT variables
         | Identifier
         // place all the keywords here to resolve "keywords can also be identifiers" problem   
         ;
        /**
         * Tokens 
         * */
    
        // Drop
        DROP: D R O P;
        DATA: D A T A;
    
        Identifier  : [a-zA-Z_] ([a-zA-Z_0-9])*  ;