问题:我正在使用 ANTLR 开发自定义解析器来定义一种小型编程语言。其中一个要求是返回语句只能出现在函数主体内。如果返回语句出现在函数外部,解析器应该抛出错误。
以下是我正在使用的简化语法(在 ANTLR 中):
grammar Grammar;
options {
language=Python3;
}
// Parser Rules
program: (var_decl | fun_decl)*;
fun_decl: type_spec ID '(' param_decl* (';' param_decl)* ')' body; // Function declarations
param_decl: type_spec ID (',' ID)* ; // Parameters for functions
type_spec: 'int' | 'float' ; // Valid types
body: '{' stmt* '}';
expr: 'expr';
stmt: assignment | call | r_return | var_decl;
var_decl: param_decl ';'; // Variable declarations
assignment: ID '=' expr ';';
call: ID '(' expr* (',' expr)* ')' ';';
r_return: 'return' expr ';';
// Lexer Rules
WS: [ \t\r\n] -> skip ; // Skip whitespace
ID: [a-zA-Z]+ ; // Identifiers (variable and function names)
ERROR_CHAR: . {raise ErrorToken(self.text)} ; // Error handling
问题是,此语法允许返回语句 (r_return) 出现在允许 stmt 的任何地方,包括全局范围内。例如:
int x;
return x; // This should throw an error.
但在函数内部,它应该可以工作:
int myFunction() {
return 42; // Valid
}
我想了想,但没有找到解决办法。请帮帮我。