Я работаю с 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
Не могли бы вы использовать препроцессор C здесь? Просто '#define SHARED', чтобы вы его хотели, затем используйте его со строками. – tripleee
Я не знаком с LEX или YACC, но предположительно «SHARED» можно заменить на '[/=%?!.$_ ~ &^<>(), + -]', тогда его не так сильно, чтобы вы могли просто включите его в каждое регулярное выражение. – OGHaza
Спасибо за помощь. То, что я сделал, это определить как токен regext, похожий на тот, который @OGHaza посоветовал мне в file.lex, а затем я использую его в самой грамматике (file.y). Я собираюсь проверить это. – pafede2