Parsing 在没有适用的规则时放弃前瞻

Parsing 在没有适用的规则时放弃前瞻,parsing,happy,Parsing,Happy,是否有一种方法(例如,指令)指示Happy解析器生成器在没有发现适用规则的情况下,根据特定的前瞻性而放弃前瞻性?作为一个实际的例子,考虑一种类似C语言的语言,它使用新的行来打破语句,但以保守的方式。例如: if (x < y) return 而且它仍然是明确的。但条件语句的相应规则如下所示: Statement ::= "if" IgnoreNL "(" IgnoreNL Expression IgnoreNL ")" Igno

是否有一种方法(例如,指令)指示Happy解析器生成器在没有发现适用规则的情况下,根据特定的前瞻性而放弃前瞻性?作为一个实际的例子,考虑一种类似C语言的语言,它使用新的行来打破语句,但以保守的方式。例如:

if (x < y)
return
而且它仍然是明确的。但条件语句的相应规则如下所示:

Statement ::= "if" IgnoreNL "(" IgnoreNL Expression IgnoreNL ")" IgnoreNL Statement "\n"
其中,
IgnoreNL
是一个虚构的非终端,其唯一目的是消耗新行。相反,我希望省略这样一个非终结符,并指示Happy在发现不合适的新行时继续解析。我想到的一种方法是直接从指定自动调用的
parseError
函数中恢复,但我认为这实际上是不可能的

编辑:我仍在试验,但在生成的代码中,可能足以包含以下情况:

happyFail explist (i) tk (HappyState (action)) sts stk =
    happyNewToken action sts stk
其中,
(i)
是有关前瞻的数字代码。但当然,每次重新生成解析器时,都必须记住包含大小写。我仍在等待有人提供更优雅的方式

happyFail explist (i) tk (HappyState (action)) sts stk =
    happyNewToken action sts stk