1

在使用 GNU bison 时,是否可以在匹配产品后什么都不做,然后检查是否可以使用其他规则来减少相同的令牌序列?基本上,我正在寻找的是类似于这个:

iexpr: VARIABLE { if (condition) {
                    /*some action */
                  }
                  else {
                    /*pushback read symbol, and check if other pattern can
                         be matched */
                  }
                }
 fexpr: VARIABLE {   }

谢谢

4

2 回答 2

1

您应该能够为此使用 YYBACKUP 功能。

于 2012-12-25T00:13:28.813 回答
1

好吧,你可以用btyacc来做到这一点——一个做回溯的 yacc 变体:

iexpr: VARIABLE [ if (!condition)
                     /* this parse was wrong, backtrack and try something else */
                    YYERROR; ]
                { /* some action */ }
fexpr: VARIABLE { /* some other action */  }

但正如评论者所指出的,尝试在解析器中进行类型检查是一个坏主意,只会导致不必要的复杂语法和糟糕的、令人困惑的类型错误错误消息。

相反,只需expr为所有类型的表达式设置单个(一组)规则,并在生成的解析树上单独进行类型检查。您甚至不需要构建整个解析树并为此保留它;您可以构建解析树的一小部分并立即对它们进行类型检查,然后在进一步解析之前丢弃不需要的信息。就像是:

expr: expr '+' expr {
    Typecheck('+', $1, $3); /* make sure operand types are appropriate for an add */
    $$ = BuildBinopCode('+', $1, $2); /* build some code to add two things */
}
于 2012-12-25T07:13:34.803 回答