2015-08-06 4 views
0

У меня есть этот лексер Jison и анализатор:Jison Lex без белых пространств

%lex 
%% 

\s+    /* skip whitespace */ 
'D01'   return 'D01' 
[xX][+-]?[0-9]+ return 'COORD' 
<<EOF>>   return 'EOF' 
.    return 'INVALID' 

/lex 

%start source 
%% 

source 
: command EOF; 

command 
: D01 COORD; 

Это будет разметить и синтаксический анализ D01 X45 но не D01X45. Что мне не хватает?

ответ

2

В отличие от (f) lex - или, действительно, подавляющее большинство генераторов сканеров, jison-сканеры не реализуют правило длинного совпадения. Вместо этого выигрывает первый совпадающий шаблон.

Для того чтобы эта работа работала над ключевыми словами, сканеры jison также реализуют ограничение на то, что простые литеральные строки - например, «D01» - совпадают только в том случае, если они заканчиваются на границе слова.

Чтобы обойти эту проблему, чтобы заключить буквального строку шаблона с избыточными круглые скобки:

("D01")  { return 'D01'; } 

Это отражено в jison wiki