Antlr获取不匹配的输入';(';期望';(';异常
我正试图为以下语句编写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
data (DROP=hello);
我的Antlr语法是:
DATA '(' DROP EQUAL 'hello' ')' ';'
不确定我在这里遗漏了什么。我的测试声明是:
Data File1(compress=char REUSE=YES);
/*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
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) ')') ;
当您有一个与此输入匹配的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])* ;