ANTLR4 中的解析器规则混淆

Parser rules confusion in ANTLR4

我很困惑是否允许以下​​内容:

(我在 forloop 规则中使用 declaration 但是 declaration 也定义了如何声明其他东西。这可以在编译器中稍后检查错误吗?我清楚了吗?)

declaration :

operand ASSIGNMENTOPERATOR variable var_type CONST?
|operations ASSIGNMENTOPERATOR variable var_type CONST?
|funcall ASSIGNMENTOPERATOR variable var_type CONST?
|(funcall|operand|NOINDEXARRAY) ASSIGNMENTOPERATOR variable var_type ARRAY CONST? ;

forloop :
block
(LPARENS ((number_operation ASSIGNMENTOPERATOR variable)|number_functions)
    SEMICOLON bool_operation
    SEMICOLON declaration
    RPARENS
)
'for'
;

更新: 我知道当我在 for 循环中提供正确类型的声明时它会起作用。问题是如果我不这样做会怎样?

看来您想到的是语义阶段,这在解析器设置中非常典型。解析输入只是工作的一小部分。通常您在此之后有一个步骤来验证您的解析树(例如查找重复的变量名称或未知符号并检查其他条件)。这通常称为语义阶段(解析是句法阶段)。

您可以将此语义阶段用于所有类型的错误检查,包括您的 declaration 检查(无论您想在那里检查什么,您的问题都不清楚)。