2016-02-16 6 views
0

Я пытаюсь использовать библиотеку peg.js для анализа математических выражений. я ставлю в online peg.js следующую грамматику:вычисление парсинга с PEG.js

start 
    = any 

additive 
    = left:primary "+" right:any { return left + right; } 

multiplicative 
    = left:primary "*" right:any { return left * right; } 

any 
    = multiplicative 
    /additive 
    /primary 

primary 
    = float 
    /integer 
    /"(" any:any ")" { return any; } 
    /"" { return 0; } 

float "float" 
    = left:[0-9]+ "." right:[0-9]+ { return parseFloat(left.join("") + "." + right.join("")); } 

integer "integer" 
    = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 

Но когда я пытаюсь вычислить: 3*5+1 Я получаю 18

+0

Вы сделали правильную ассоциативную грамматику, и вы сделали умножение и добавление с одинаковым приоритетом. – Pointy

+0

Как сделать правильный приоритет оператора? – Joe

+0

Вам нужен еще один нетерминальный «слой», так что умножения анализируются как группы на более низком уровне, чем дополнительные операнды. – Pointy

ответ

1

Я думаю, что ниже код, что вы после этого.

Уловка с вашим самым слабым оператором (+) имеет правило, которое ссылается на правило умножения, так что сложение не может произойти до тех пор, пока не будет согласовано умножение, что, в свою очередь, не может произойти до тех пор, пока не будут согласованы первичные выражения.

start 
    = any 

any 
    = additive 

additive 
    = left:multiplicative "+" right:additive { return left + right; } 
    /multiplicative 

multiplicative 
    = left:primary "*" right:multiplicative { return left * right; } 
    /primary 


primary 
    = float 
    /integer 
    /"(" any:any ")" { return any; } 
    /"" { return 0; } 

float "float" 
    = left:[0-9]+ "." right:[0-9]+ { return parseFloat(left.join("") + "." + right.join("")); } 

integer "integer" 
    = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 
Смежные вопросы