【问题标题】:Expression occurrences in flex/bisonflex/bison 中的表达式出现
【发布时间】:2017-09-22 11:44:47
【问题描述】:

假设我有一个像这样的 Bison 表达式:

multiply:    T_FIGURE                     { $$ = $1; }
        |    multiply T_ASTERISK multiply { $$ = $1 * $3; }
;

它应该返回一些数字相乘的结果,或者如果只提供一个数字,则返回输入。如果我想将提供的数字限制为最多 3 个,我会重写如下表达式:

multiply:   T_FIGURE                                          { $$ = $1; }
      |     T_FIGURE T_MULTIPLY T_FIGURE                      { $$ = $1 * $3; }
      |     T_FIGURE T_MULTIPLY T_FIGURE T_MULTIPLY T_FIGURE  { $$ = $1 * $3 * $5; }
;

我的问题:有没有办法重写这个表达式,这样我就不必手动指定出现次数,而是使用某种参数能够轻松地将上限更改为例如 30 次出现?

【问题讨论】:

    标签: regex parsing syntax bison flex-lexer


    【解决方案1】:

    一句话,“不”。这不是 bison 的特性(也不是我所知道的任何 yacc 衍生物)。

    解决此类问题的最简单方法是使用代码生成器。要么使用可用的宏处理器,如 m4,要么使用任何你觉得舒服的脚本语言编写你自己的脚本。

    您还可以通过计算语义操作中的参数来动态解决问题(这意味着修改语义类型以同时包含值和计数。)如果超出计数,您可能会引发语法错误。 (同样,在您的语义操作中。)这种方法的主要优点是避免破坏解析器的状态表。如果您的限制很大并且相互影响,您可能会发现您正在生成一个非常大的状态机。

    作为一个非常简单的例子(只有一个运算符):

    %{
       typedef struct ExprNode {
         int    count;
         double value;
       } ExprNode;
    %}
    
    %union {
         ExprNode expr;
         double   value;
    }
    
    %token  <value> T_FIGURE
    %type   <expr>  expr multiply 
    %%
    
    expr:     T_FIGURE          { $$.count = 0; $$.value = $1; }
    multiply: expr
            | multiply '*' expr { if ($1.count >= LIMIT) {
                                    yyerror("Too many products");
                                    YYABORT;
                                  }
                                  else {
                                    $$.count = $1.count + 1;
                                    $$.value = $1.value * $3.value;
                                  }
                                } 
    

    【讨论】:

    • 感谢您的回复。您能否提供一个此类动态计数的示例?
    • @mzzz:你去吧。您需要根据您的问题域进行调整,它可能适用也可能不适用。但我认为它显示了基本部分。
    • 感谢您提供宝贵的示例
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    相关资源
    最近更新 更多