我对是否允许以下内容感到困惑:
(我正在使用声明在 forloop 规则中,但是声明也定义了如何声明其他内容。这可能是稍后检查的错误编译器?我清楚吗?)
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
检查(无论您想在此检查什么,这都不清楚您的问题)。