2013-10-08 2 views
0

Я хочу написать парсер с помощью Bison/Yacc + Lex который можно разобрать заявления типа:Отличительные идентификаторы из общих строк

VARIABLE_ID = 'STRING' 

где:

ID  [a-zA-Z_][a-zA-Z0-9_]* 

и:

STRING  [a-zA-Z0-9_]+ 

Так , var1 = '123abc' является действительным заявлением, а 1var = '123abc' нет.

Поэтому VARIABLE_ID является STRING, но STRING не всегда является VARIABLE_ID.

Что я хотел бы знать, так это то, что единственный способ различать эти два - это написать процедуру проверки на более высоком уровне (то есть внутри кода Bison), или если я смогу его обработать в коде Lex.

+1

Не ваши строки всегда окружены одинарными кавычками, как вы их написали? – rici

ответ

2

Ваш абстрактный синтаксис утверждение на самом деле:

VARIABLE = STRING 

и не

VARIABLE = 'STRING' 

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

ID  [a-zA-Z_][a-zA-Z0-9_]* 
STRING '[a-zA-Z_0-9]*' 

ID это буква или знак подчеркивания, а затем в любой комбинации (включая пустые) из букв, цифр и символов подчеркивания.

A STRING - это одиночная кавычка, за которой следуют последовательность (возможно, пустые) буквы, цифры и символы подчеркивания, а затем другая одинарная цитата.

Таким образом, двусмысленность, о которой вы беспокоитесь, не существует. ID на самом деле не STRING, и наоборот.

Где-то внутри вашего анализатора Bison или, возможно, в лексере вы можете массировать yytext совпадения STRING, чтобы удалить кавычки и просто сохранить текст между ними в виде строки. Это может быть правило Bison, возможно, похожее на:

string : STRING 
     { 
      $$ = strip_quotes($1); 
     } 
     ; 
Смежные вопросы