2016-11-17 1 views
0

я определил следующие псевдонимы:Lex модель не реагирует на входы

WS [ \t\n] 
WSS {WS}* 
NEWSS {WS}+ 
NAME [A-Za-z_][A-Za-z0-9_-]* 
WORD [^;]+ 
VAR_USE ${WSS}{NAME}{WSS}: 
VAR_DEF ${VAR_USE}{WSS}{WORD}{WSS}; 

И два простых правила:

{VAR_DEF} cout << "VAR DEF"; 
{VAR_USE} cout << "VAR USE"; 

Когда я запустить программу и я начинаю писать слова, когда я пишу слова, которые должны быть обнаружены вторым правилом, он просто не реагирует, пока я не напишу слово, обнаруженное первым правилом. (Это не эхо и не обнаружено)
Например, вот скриншот краткосрочной перспективе:
enter image description here

Первый вход вторит, второй вход обнаружен второй правило, третий вход должен быть обнаружен первым правилом но это не так. В чем может быть проблема?

+0

Я не вижу, как эта спецификация lex может произвести этот вывод. 'VAR_DEF' требует двух последовательных двоеточий, и ваш вход имеет только один. – rici

+0

К сожалению, я скопировал это неправильно. Хотя он все еще не объясняет, что это не отражается. – sel

ответ

1

VAR_USE может быть сопоставлен только в том случае, если VAR_DEF не работает (поскольку это префикс VAR_DEF). Для отказа, суффикс

{WSS}{WORD}{WSS}; 

должен быть несовместимым. Но {WORD} соответствует любой строке, не содержащей точку с запятой, даже если она включает в себя новую строку. Если на входе есть точка с запятой, {VAR_DEF} будет соответствовать этой точке с запятой. Если нет, {VAR_DEF} не сработает, и лексер вернется к {VAR_USE}, но сканер не сможет сказать, что нет следующей точки с запятой, пока она не дойдет до конца ввода. (I.e., когда вы вводите ctl-D, а затем Enter.).

+0

Я вижу, так как я могу сделать lex take {VAR_USE}, чтобы он соответствовал, когда он видит строку, которая заканчивается на «:», но не может найти в настоящее время более длинное правило соответствия? – sel

+0

@enemy: начните с четкого указания того, что означает «несоответствие». – rici

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