2014-11-20 1 views
0

Так что я произвел синтаксический анализатор с помощью JISON:Validations в JISON парсере

%lex 
%x TEXT 
%% 

("Project"|"project") {return 'PROJECTCOMMAND';} 
"-au" {return 'ADDUSER';} 
"-n" {this.begin('TEXT'); return 'NAMEOPTION';} 
"-k" {return 'KEYOPTION';} 
"-desc" {return 'DESCRIPTION';} 
("--add"|"-a") {return 'ADDOPTION';} 
<TEXT>[[email protected]\.]+ {this.popState(); return 'TEXT';} 
<INITIAL,TEXT>\s+ // Ignore white space... 

/lex 
%% 
line : 
     PROJECTCOMMAND ADDUSER 
      { 
       //Project Command of add user 
       var res = new Object(); 
       res.value = "addUser Project"; 
       return res; 
      }  
    | PROJECTCOMMAND ADDOPTION 
      { 
       //Project Command with no arguments 
       var res = new Object(); 
       res.value = "addProject"; 
       return res; 
      } 
    | PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT 
      { 
       //Project command with project name as argument 
       var res = new Object(); 
       res.value = "addProject name"; 
       res.name = $4; 
       return res; 

    }  

Есть ли способ, что я могу сделать валидации по команде, то есть, если команда не удовлетворяет ни одному из указанных выше правил, то бросить ошибку. т.е. с параметром по умолчанию.
Нечто подобное в конце синтаксического анализа:

| return "command is invalid"; 

Заранее спасибо

ответ

0

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

Parsers обычно не работают как процедурные программы, поскольку у вас не может быть предложения «по умолчанию» или «else», как вы могли бы иметь в коммутаторе или инструкции if при программировании, и хотя это похоже на простое расширение, это не. Именно по этой причине некоторые люди все еще пишут собственный собственный парсер, потому что он дает им гибкость для обработки таких ситуаций с ошибками. Ошибка возникает, когда правила не соответствуют тексту. На эту тему написано много научных статей, но небольшой пример можно найти здесь: http://research.swtch.com/yyerror.

Вы спрашивали о JISON, который основан на yacc/bison. В yacc/bison ситуация с ошибкой обрабатывается built in feature known as yyerror. Это позволяет настраивать сообщение об ошибке отказа, например, «команда недействительна». Насколько я могу судить, this feature is not yet implemented in JISON.

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

| PROJECTCOMMAND ADDOPTION NAMEOPTION 
    { // Error 
     return something; 
    } 
| ADDOPTION NAMEOPTION TEXT 
    { // Error 
     return something; 
    } 
| NAMEOPTION TEXT 
    { // Error 
     return something; 
    } 
| TEXT 
    { // Error 
     return something; 
    } 
| ADDOPTION TEXT 
    { // Error 
     return something; 
    } 
.... and every other combination of tokens .... 

и, как вы можете видеть, это и ужасно, и менее чем удовлетворительно.