Java 如何为antlr4中的函数创建令牌

Java 如何为antlr4中的函数创建令牌,java,antlr4,Java,Antlr4,我需要一些帮助,因为我知道如何创建一种在我的语言上定义函数的方法: function: ID ‘as’ DATATYPE ‘(‘ arguments ‘)’ instruction* EndFun; 我的问题是,如果我想创建“void”函数,如何防止用户输入“return ID” function: ID (‘as’ DATATYPE)? ‘(‘ arguments ‘)’ instruction* EndFun; ps:instructions令牌包括“return I

我需要一些帮助,因为我知道如何创建一种在我的语言上定义函数的方法:

function: 
    ID ‘as’ DATATYPE ‘(‘ arguments ‘)’ instruction* EndFun;
我的问题是,如果我想创建“void”函数,如何防止用户输入“return ID”

function: 
    ID (‘as’ DATATYPE)? ‘(‘ arguments ‘)’ instruction* EndFun;

ps:instructions令牌包括“return ID”

在解析后检查
void
函数是否包含return语句(这是我要做的),或者执行类似以下操作:

function: 
    ID (‘as’ DATATYPE)? ‘(‘ arguments ‘)’ instruction* EndFun;
function
 : ID 'as' DATATYPE '(' arguments ')' instruction* EndFun
 | 'void' '(' arguments ')' instruction_no_return* EndFun
 ;

instruction
 : instruction_no_return
 | 'return' ID
 ;

instruction_no_return
 : instruction_a
 | instruction_b
 | instruction_c
 ;

在解析后检查
void
函数是否包含return语句(这是我要做的),或者执行以下操作:

function
 : ID 'as' DATATYPE '(' arguments ')' instruction* EndFun
 | 'void' '(' arguments ')' instruction_no_return* EndFun
 ;

instruction
 : instruction_no_return
 | 'return' ID
 ;

instruction_no_return
 : instruction_a
 | instruction_b
 | instruction_c
 ;

我不确定您是否可以防止错误的输入,因为antlr是一个解析器。你可以做的是检查解析后的返回语句和类型。添加到Thomas的注释中:你所追求的是语义需求,而不是语法需求。因此,它不应该进入解析器规则,而是在语义阶段,这在解析非平凡语言时几乎总是必要的。巴特的回答反映了这个想法(在第一个选项中)。是的,你是对的,我不确定你能防止错误的输入,因为antlr是一个解析器。你可以做的是检查解析后的返回语句和类型。添加到Thomas的注释中:你所追求的是语义需求,而不是语法需求。因此,它不应该进入解析器规则,而是在语义阶段,这在解析非平凡语言时几乎总是必要的。巴特的回答反映了这个想法(在第一个选项中)。是的,你是对的,假设
指令no\u返回
包含嵌套语句,如
if'('expression')”指令no\u返回
,你将无法在
指令
中使用
指令no\u返回
。你必须复制整个东西。所以我肯定会选择选项1。假设
指令no\u return
包含嵌套语句,如
if'('expression')指令no\u return
,您将无法在
指令中使用
指令no\u return
。你必须复制整个东西。所以我肯定会选择选项1。