2014-12-15 3 views
0

Я разрабатываю язык с использованием Jison, и проблема, с которой я сталкиваюсь, - это приоритет оператора. Я хочу, чтобы операторы сравнения быть первыми операторами, которые будут оценены, так, например, 1 + 2 < 3 - 3 * 4 станет (1+2) < (3 - (3 * 4))Приоритет оператора Jison

правила у меня прямо сейчас:

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

Любая помощь Виль высоко оценили

ответ

0

В лучший способ получить приоритет оператора в контекстной свободной грамматике - использовать несколько правил, которые указывают уровни приоритета. Например, с помощью простой арифметики:

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

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

factor : IDENTIFIER 
     | CONSTANT 
     | LEFT expression RIGHT 
     ; 

Используя эту иерархию реализованы в BODMAS правила арифметики.

Вы можете сделать что-то подобное с вашей грамматикой: перерыв в несколько правил, представляющих разные уровни приоритета.

(см стандартный компилятор написания информатику текстов для более подробной информации)

+0

я уже получил это работает, используя встроенный приоритет оператора с% влево% вправо и% nonassoc – Dirk

 Смежные вопросы

  • Нет связанных вопросов^_^