首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jison算子优先

Jison算子优先
EN

Stack Overflow用户
提问于 2014-12-15 21:11:56
回答 1查看 439关注 0票数 0

我正在使用Jison开发一种语言,而我遇到的一个问题是操作符优先。我希望比较运算符是第一个要计算的运算符,例如,1 + 2 < 3 - 3 * 4将变成(1+2) < (3 - (3 * 4))

我现在的规矩是:

代码语言:javascript
复制
expression
  : expression OP_COMPARISON expression
    { $$ = { type: "Comparison", operator: $2, args: [$1, $3], location: locationFromObject(@$) } }
  | literal
    { $$ = $literal; }
  | NAME
    { $$ = { type: "Variable", variable: $1, location: locationFromObject(@$) }; }
  | field
    { $$ = { type: "Field", field: $field, location: locationFromObject(@$) }; }
  | '(' ':' typename ')' expression
    { $$ = { type: "Cast", cast_type: $typename, expression: $expression, location: locationFromObject(@$) }; }
  | function_call
    { $$ = $function_call; $$.type = "FunctionCall"; }
  | method_call
    { $$ = $method_call; $$.type = "FunctionCall"; }
  | '(' expression ')'
    { $$ = { type: "Grouped", expression: $expression, location: locationFromObject(@$) }; }
  | OP_PREPOSTFIX expression
    { $$ = { type: "Prefix", operator: $1, arg: $expression, location: locationFromObject(@$) }; }
  | expression OP_PREPOSTFIX
      { $$ = { type: "Postfix", operator: $2, arg: $expression, location: locationFromObject(@$) }; }
  | expression OP_ARITHMETIC expression
    {
      if($1.type == "Arithmetic"){
        $$ = $1;
        $$.args.push($3);
        $$.operators.push($2);
        $$.location = locationFromObject(@$);
      }else{
        $$ = { type: "Arithmetic", operators: [$2], args: [$1, $3], location: locationFromObject(@$) };
      }
    }
  | expression OP_LOGICAL expression
    {
      if($1.type == "Logical"){
        $$ = $1;
        $$.args.push($3);
        $$.operators.push($2);
        $$.location = locationFromObject(@$);
      }else{
        $$ = { type: "Logical", operators: [$2], args: [$1, $3], location: locationFromObject(@$) };
      }
    }
  | '!' expression
    { $$ = {type: "LogicalNot", arg: $expression, location: locationFromObject(@$) }; }
  ;

任何帮助都将受到极大的感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-27 22:36:21

使运算符优先进入上下文无关文法的最佳方法是使用指示优先级级别的几个规则。例如,使用简单的算术:

代码语言:javascript
复制
expression : expression PLUS term
           | expression MINUS term
           | term
           ;

term : term MULTIPLY factor
     | term DIVIDE factor
     | factor
     ;

factor : IDENTIFIER
       | CONSTANT
       | LEFT expression RIGHT
       ;

利用该层次结构实现了BODMAS算法规则。

您可以使用语法做类似的事情:分解成几个表示不同优先级层的规则。

(有关更多细节,请参见编写计算机科学文本的标准编译器)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27493202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档