ANTLR 4 - 未正确解析

问题描述 投票:0回答:2
grammar Expr;

// parser rules
prog : ((decl_list expr | expr) ';' NEWLINE?)*;

decl_list : decl decl_list
     | decl
     ;

decl : DEF FUN var_list '=' expr ENDEF
     | DEF FUN '=' expr ENDEF
     ;

var_list : PARAM var_list 
     | PARAM 
     ;

expr : LET VAR '=' expr IN              # assignExpr
     | FUN '()'                         # callExpr
     | FUN '(' expr_list ')'            # callExpr
     | expr ('*'|'/') expr              # infixExpr
     | expr ('+'|'-') expr              # infixExpr 
     | '(' expr ')'                     # parensExpr
     | num                              # numberExpr
     | '~' expr                         # negateExpr
     | VAR                              # varExpr
     ;

expr_list : expr',' expr_list
     | expr
     ;

num  : '-'? INT
     | '-'? FLOAT
     ;

// lexer rules                    
NEWLINE: [\r\n]+ ;
INT: [0-9]+ ;          // should handle negatives
FLOAT: [0-9]+'.'[0-9]* ; // should handle signs(+/-)
WS: [ \t\r\n]+ -> skip;
VAR: [a-zA-Z_-]+;
PARAM: [a-zA-Z_]+;
FUN: [a-zA-Z0-9]+;
DEF: 'def';
ENDEF: 'endef';
LET: 'let';
IN: 'in';

我目前正在使用antlr4制作f1vae解析器。 该行从 prog 开始,通过 decl_list 声明函数,并用声明的函数解释 expr。

当我把这个放在下面时,问题就发生了:

def f = 3 endef def g x y = x + y endef let x = f() in g(1,x);

它收到此错误消息

line 1:4 missing ';' at 'f'
line 1:6 mismatched input '=' expecting {';', '*', '/', '+', '-'}

为什么会发生这种情况? 尝试更改解析器顺序,但没有成功。

antlr antlr4
2个回答
0
投票

正如评论中提到的:您有重叠的词法分析器规则。例如,输入

"in"
可以通过以下词法分析器规则进行匹配:

VAR: [a-zA-Z_-]+;
PARAM: [a-zA-Z_]+;
FUN: [a-zA-Z0-9]+;
IN: 'in';

当输入可以被多个规则匹配时,ANTLR 会选择第一个。因此,

"in"
永远成为
VAR
代币。

相反,尝试这样的事情:

grammar Expr;

// parser rules
prog : ((decl_list expr | expr) ';' NEWLINE?)*;

decl_list : decl decl_list
     | decl
     ;

decl : DEF fun var_list '=' expr ENDEF
     | DEF fun '=' expr ENDEF
     ;

var_list : param var_list
     | param
     ;

expr : LET var '=' expr IN expr         # assignExpr
     | fun '(' ')'                      # callExpr
     | fun '(' expr_list ')'            # callExpr
     | expr ('*'|'/') expr              # infixExpr
     | expr ('+'|'-') expr              # infixExpr
     | '(' expr ')'                     # parensExpr
     | num                              # numberExpr
     | '~' expr                         # negateExpr
     | var                              # varExpr
     ;

expr_list : expr',' expr_list
     | expr
     ;

num  : '-'? INT
     | '-'? FLOAT
     ;

var: ID;
param: ID;
fun: ID;

// lexer rules
NEWLINE: [\r\n]+ ;
INT: [0-9]+ ;          // should handle negatives
FLOAT: [0-9]+'.'[0-9]* ; // should handle signs(+/-)
WS: [ \t]+ -> skip;
DEF: 'def';
ENDEF: 'endef';
LET: 'let';
IN: 'in';
ID : [a-zA-Z_] [a-zA-Z0-9_-]*; // Place this after your keyword rules!

0
投票

你是SKKU学生吗?是proj3吧?哈哈 "교수님한테 말 안할게요 ㅋㅋ

\n "
© www.soinside.com 2019 - 2024. All rights reserved.