2014-11-20 2 views
0

Привет Я новичок в JISON и застрял в следующем коде:
Для разбора команды:вопросы JISON с командой разборе

project -a -n <projectname> 

Мой код выглядит следующим образом:

"project" {return 'PROJECTCOMMAND';} 
"-n"  {return 'NAMEOPTION';} 
("--add"|"-a") {return 'ADDOPTION';} 
[[email protected]\.]+ {return 'TEXT';} 

line : 
    PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT 
      { 
       //Prject command with project name as argument 
       var res = new Object(); 
       res.value = "addProject name"; 
       res.name = $4; 
       return res; 
      } 

это работает если команда такова:

project -a -n samplePro 

Но дает ошибку, если команда является:

project -a -n project 

Ошибка: ожидающий ТЕКСТ и получивший PROJECTCOMMAND.
То же самое происходит, если имя проекта в команде - project1, project2, myproject и т. Д. Есть ли способ исправить это?
Заранее благодарен

ответ

1

Один из способов решить это - использовать состояние. Формальное название того, что я называю «состояние» здесь, - это «условие начала», но я считаю, что «состояние» для меня является более понятным, чем «условие начала».

  1. Я объявил новое лексерское состояние с %x TEXT. Существует состояние INITIAL, которое существует неявно. Это состояние, в котором начинается лексер. Любой шаблон, который не получает указанное состояние, существует только в состоянии INITIAL.

  2. Я поставил <TEXT> перед шаблоном, который приводит к TEXT маркеров, так что этот маркер генерируется только, когда мы находимся в состоянии TEXT.

  3. Я установил шаблон для пробелов для применения к состояниям INITIAL и TEXT.

  4. Я сделал это так, что -n заставляет лексера войти в TEXT состояние и когда TEXT лексема встречается, состояние выталкивается.

При этом на месте, когда Jison встречает -n в project -a -n project он попадает в TEXT состояние, в котором единственное, что ожидаемые пробелы, которые игнорируются или TEXT жетоны. Затем Джисон обрабатывает пустое пространство, которое оно игнорирует. Затем он обрабатывает следующий текст, который понимается как токен TEXT и выдает состояние.

Полный код:

%lex 

%x TEXT 

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

/lex 

%% 

line : 
    PROJECTCOMMAND ADDOPTION NAMEOPTION TEXT 
      { 
       //Prject command with project name as argument 
       var res = new Object(); 
       res.value = "addProject name"; 
       res.name = $4; 
       return res; 
      } ; 
+0

Спасибо за ответ, Не могли бы вы поделиться со мной какие-либо учебные пособия, где я могу узнать об этих состояниях, начинаются («TEXT»), popState() – Abhishek

+0

Документально [здесь] (https://zaach.github.io/jison/docs/#lexical-analysis). – Louis