Parsing ANTLR4输入不匹配'';期望

Parsing ANTLR4输入不匹配'';期望,parsing,input,antlr,expect,mismatch,Parsing,Input,Antlr,Expect,Mismatch,目前,我刚刚在ANTLR4中定义了简单的规则: // Recognizer Rules program : (class_dcl)+ EOF; class_dcl: 'class' ID ('extends' ID)? '{' class_body '}'; class_body: (const_dcl|var_dcl|method_dcl)*; const_dcl: ('static')? 'final' PRIMITIVE_TYPE ID '=' expr ';'; var_dcl: (

目前,我刚刚在ANTLR4中定义了简单的规则:

// Recognizer Rules

program  : (class_dcl)+ EOF;
class_dcl: 'class' ID ('extends' ID)? '{' class_body '}';
class_body: (const_dcl|var_dcl|method_dcl)*;
const_dcl: ('static')? 'final' PRIMITIVE_TYPE ID '=' expr ';';
var_dcl: ('static')? id_list ':' type ';';
method_dcl: PRIMITIVE_TYPE ('static')? ID '(' para_list ')' block_stm;
para_list: (para_dcl (';' para_dcl)*)?;
para_dcl: id_list ':' PRIMITIVE_TYPE;
block_stm: '{' '}';
expr: <assoc=right> expr '=' expr | expr1;
expr1: term ('<' | '>' | '<=' | '>=' | '==' | '!=') term | term;
term: ('+'|'-') term | term ('*'|'/') term | term ('+'|'-') term | fact;
fact: INTLIT | FLOATLIT | BOOLLIT | ID | '(' expr ')';
type: PRIMITIVE_TYPE ('[' INTLIT ']')?;
id_list: ID (',' ID)*;

// Lexer Rules

KEYWORD: PRIMITIVE_TYPE | BOOLLIT | 'class' | 'extends' | 'if' | 'then' | 'else'
    | 'null' | 'break' | 'continue' | 'while' | 'return' | 'self' | 'final'
    | 'static' | 'new' | 'do';
SEPARATOR: '[' | ']' | '{' | '}' | '(' | ')' | ';' | ':' | '.' | ',';
OPERATOR: '^' | 'new' | '=' | UNA_OPERATOR | BIN_OPERATOR;
UNA_OPERATOR: '!';
BIN_OPERATOR: '+' | '-' | '*' | '\\' | '/' | '%' | '>' | '>=' | '<' | '<='
    | '==' | '<>' | '&&' | '||' | ':=';
PRIMITIVE_TYPE: 'integer' | 'float' | 'bool' | 'string' | 'void';
BOOLLIT: 'true' | 'false';
FLOATLIT: [0-9]+ ((('.'[0-9]* (('E'|'e')('+'|'-')?[0-9]+)? ))|(('E'|'e')('+'|'-')? [0-9]+));
INTLIT: [0-9]+;
STRINGLIT: '"' ('\\'[bfrnt\\"]|~[\r\t\n\\"])* '"';
ILLEGAL_ESC: '"' (('\\'[bfrnt\\"]|~[\n\\"]))* ('\\'(~[bfrnt\\"]))
    {if (true) throw new bkool.parser.IllegalEscape(getText());};
UNCLOSED_STRING: '"'('\\'[bfrnt\\"]|~[\r\t\n\\"])*
    {if (true) throw new bkool.parser.UncloseString(getText());};
COMMENT: (BLOCK_COMMENT|LINE_COMMENT) -> skip;
BLOCK_COMMENT: '(''*'(('*')?(~')'))*'*'')';
LINE_COMMENT: '#' (~[\n])* ('\n'|EOF);
ID: [a-zA-z_]+ [a-zA-z_0-9]* ;

WS: [ \t\r\n]+ -> skip ;
ERROR_TOKEN: . {if (true) throw new bkool.parser.ErrorToken(getText());};
它返回了错误:

BKOOL::program:3:8: mismatched input 'integer' expecting PRIMITIVE_TYPE
BKOOL::program:3:17: mismatched input '=' expecting {':', ','}

我还不知道为什么。你能告诉我为什么它没有像我期望的那样识别规则和令牌吗?

Lexer规则是独占的。最长的获胜,平局者是语法顺序

就你而言<代码>整数是一个
关键字
而不是
基本类型

你应该在这里做什么:

  • 为每个关键字创建一个不同的标记,而不是所有捕获的
    关键字
    规则
  • 基本类型
    转换为解析器规则
  • 操作员也一样
现在,你的例子是:

class abc
{
 final integer x=1;
}
转换为词素,例如:
ID
最终
关键字
ID
}

这要感谢隐式标记类型,因为您在解析器规则中使用了
'class'
等定义。这些被转换成匿名令牌,比如
T_001:'class'获得最高优先级的代码

如果不是这样的话,你最终会得到:
关键字
ID
分隔符
关键字
关键字关键字ID
操作员
分隔符

那就是。。。不太容易解析;-)

这就是为什么我要告诉你正确分解你的代币。

Lexer规则是排他性的。最长的获胜,平局者是语法顺序

就你而言<代码>整数
是一个
关键字
而不是
基本类型

你应该在这里做什么:

  • 为每个关键字创建一个不同的标记,而不是所有捕获的
    关键字
    规则
  • 基本类型
    转换为解析器规则
  • 操作员也一样
现在,你的例子是:

class abc
{
 final integer x=1;
}
转换为词素,例如:
ID
最终
关键字
ID
}

这要感谢隐式标记类型,因为您在解析器规则中使用了
'class'
等定义。这些被转换成匿名令牌,比如
T_001:'class'获得最高优先级的代码

如果不是这样的话,你最终会得到:
关键字
ID
分隔符
关键字
关键字
关键字ID
操作员
分隔符

那就是。。。不太容易解析;-)

这就是为什么我要告诉你正确地分解你的代币。

为了避免出现新的问题,我将我的问题编辑为另一个更难、更混乱的问题。不要这样做,这违反了SO的标准。请将您的问题还原到以前的版本,并将此问题作为新问题发布。我昨晚确实打开了new threadt。幸运的是,几小时后,我自己成功地调试了它。谢谢大家好:)我把你的问题退回到上一个版本。为了避免出现新的问题,我将我的问题编辑成另一个更难、更混乱的问题。不要这样做,这是违反SO的标准的。请将您的问题还原到以前的版本,并将此问题作为新问题发布。我昨晚确实打开了new threadt。幸运的是,几小时后,我自己成功地调试了它。谢谢大家好:)我把你们的问题退回到上一次的修订版。