2013-11-21 3 views
0

Я работаю с LEX и YACC. У меня есть вопрос о том, как определить маркера, я имею в виду у меня есть два регулярных выражения, которые разделяют некоторые символы, смотрите пример ниже:LEX? Общее регулярное выражение

SHARED   "+"|"-"|"/"|"="|"%"|"?"|"!"|"."|"$"|"_"|"~"|"&"|"^"|"<"|">"|"("|")"|"," 
REXP_1   {SHARED}|[a-zA-Z]|[ \t]+|[\\][\\\"] 
REXP_2   {SHARED}|[a-zA-Z]|[ \t]+|"*" 

Теперь моя точка, как определить, когда персонаж из общего регулярного выражения соответствует на REXP_1 или REXP_2, когда я определяю токены в третьем разделе файла .lex.

Я думаю, что я что-то недопонимаю, я думаю, что то, как я пишу регулярное выражение, неверно, но я не нахожу способ сделать это лучше. Не могли бы вы дать мне несколько советов?

Более того, я был бы признателен, если бы кто-нибудь посоветует мне некоторые критерии, чтобы определить, когда определять токен (file.lex) или когда определять символ в грамматике (file.y). Для некоторых символов легко понять, является ли это символическим символом или символом грамматики, но для некоторых других мне сложно определить, где их поставить.

Кстати, я работаю с this grammar

+0

Не могли бы вы использовать препроцессор C здесь? Просто '#define SHARED', чтобы вы его хотели, затем используйте его со строками. – tripleee

+0

Я не знаком с LEX или YACC, но предположительно «SHARED» можно заменить на '[/=%?!.$_ ~ &^<>(), + -]', тогда его не так сильно, чтобы вы могли просто включите его в каждое регулярное выражение. – OGHaza

+0

Спасибо за помощь. То, что я сделал, это определить как токен regext, похожий на тот, который @OGHaza посоветовал мне в file.lex, а затем я использую его в самой грамматике (file.y). Я собираюсь проверить это. – pafede2

ответ

1

(Answered in a question edit)

ОП писал:

Только в случае, если кто-то это интересно, я собираюсь выписать уроки я узнал , Я думаю, что самый важный урок, который я узнал, заключается в том, что здравый смысл - отличный инструмент для определения того, что является токеном-стажером в файле .lex и что является подходящим токеном для обмена файлом .y.

Поскольку термин «здравый смысл» может быть немного неоднозначным я отправляю следующий пример:

ALPHA_NUMERIC [a-bA-B0-9] 
    SQ_CHAR   {SHARED}|{ALPHA_NUMERIC} 
    SINGLE_QUOTED {SINGLE_QUOTE}{SQ_CHAR}{SQ_CHAR}*{SINGLE_QUOTE} 

где ALPHA_NUMERIC это хороший стажер маркер (file.lex), но это плохой маркер для обмена в файле грамматики тогда как SINGLE_QUOTED может быть хорошим токеном для обмена грамматикой (file.y). Я написал «может быть», потому что он очень зависит от конкретной грамматики, над которой мы работаем, в моем конкретном случае это хороший токен, чтобы поделиться с файлом YACC.

То, что я сделал, это определить как токен регулярное выражение, подобное тому, которое @OGHaza посоветовал мне в file.lex, а затем я использую его в самой грамматике (file.y).

Смежные вопросы