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 {';', '*', '/', '+', '-'}
为什么会发生这种情况? 尝试更改解析器顺序,但没有成功。
正如评论中提到的:您有重叠的词法分析器规则。例如,输入
"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!
你是SKKU学生吗?是proj3吧?哈哈 "교수님한테 말 안할게요 ㅋㅋ
\n "