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
检查(无论您想在那里检查什么,您的问题都不清楚)。
我很困惑是否允许以下内容:
(我在 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
检查(无论您想在那里检查什么,您的问题都不清楚)。