2015-01-24 2 views
2

В настоящее время я создаю язык программирования для научной ярмарки.Ошибка левого рекурсии в Peg.JS

Это мой PEG.js грамматик:

start 
    = s:Statements 
    { return ['Program', {}].concat(s); } 
/_ 

Statements 
    = s:Statement ";" 
    { return s; } 
/ss:Statements s:Statement ";" 
    { return ss; ss.push(s); } 
/_ 

Statement 
    = SetVar 

SetVar 
    = i:Ident "=" e:Expr 
    { return ['SetVarStmt', {}, i, e]; } 

Expr 
    = Ident 
/Number 

Number 
    = n:[0-9]+ 
    { return ['Number', { val: parseInt(n.join(""), 10) }]; } 

Ident 
    = i:[a-zA-Z._]* 
    { return ['Ident', { name: i.join("") }]; } 

_ = [ \t\r\n]* 

Я получаю следующее сообщение об ошибке: «Левая рекурсия обнаруженную для правила„Заявление“.» Но я не могу понять, почему это происходит.

ответ

4

У вас есть Statements = Statements Statement, который остается рекурсивным.

При использовании ПЭГ лучше всего написать Statements = Statement+, или Statements = Statement Statement*.