0

私は Jison を使用して言語を開発していますが、私が直面している問題は演算子の優先順位です。比較演算子を最初に評価する演算子にしたいので、たとえば次のように1 + 2 < 3 - 3 * 4なります(1+2) < (3 - (3 * 4))

私が今持っているルール:

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(@$) }; }
  ;

どんな助けでも大歓迎です

4

1 に答える 1

0

演算子の優先順位を文脈自由文法に組み込む最善の方法は、優先順位のレベルを示すいくつかのルールを使用することです。たとえば、単純な算術演算では次のようになります。

expression : expression PLUS term
           | expression MINUS term
           | term
           ;

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

factor : IDENTIFIER
       | CONSTANT
       | LEFT expression RIGHT
       ;

この階層を使用して、算術のBODMASルールが実装されます。

文法で同様のことを行うことができます。優先順位の異なる層を表すいくつかのルールに分割します。

(詳細については、コンピュータ サイエンスのテキストを作成する標準コンパイラを参照してください)

于 2014-12-27T22:36:21.477 に答える