Lex模式对输入

时间:2016-11-17 20:40:26

标签: flex-lexer 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

第一个输入被回显,第二个输入被第二个规则检测到,第三个输入应该被第一个规则检测到,但它不会被检测到。可能是什么问题?

1 个答案:

答案 0 :(得分:1)

VAR_USE只能在VAR_DEF失败时匹配(因为它是VAR_DEF的前缀)。为了失败,后缀为

{WSS}{WORD}{WSS};

必须是无与伦比的。但是{WORD}匹配任何不包含分号的字符串,即使它包含换行符也是如此。如果输入中的某个地方有分号,{VAR_DEF}将匹配该分号。如果没有,{VAR_DEF}将失败并且词法分析器将回退到{VAR_USE},但扫描程序无法告知在到达输入结束之前没有后续分号。 (即,当您键入ctl-D,然后按Enter键。)。