2016-11-17 75 views
0

我定义以下的别名:莱克斯模式不应对输入

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},但扫描器无法分辨出没有以下分号,直到它到达输入的末尾。 (也就是说,当你输入ctl-D,然后按Enter键)。

+0

我明白了,那么我该如何让lex采用{VAR_USE},以便在它看到以“:”结尾的字符串时匹配,但目前找不到更长的匹配规则? – sel

+0

@enemy:首先明确指出“不匹配”的含义。 – rici