我已经定义了以下别名:
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";
当我运行程序并开始编写单词时,每当我写出应该被第二条规则检测到的单词时,它就不会做出反应,直到我写出第一条规则检测到的单词为止。 (它没有回声也没有检测到)
例如,这是短期的截图:
第一个输入被回显,第二个输入被第二个规则检测到,第三个输入应该被第一个规则检测到,但它不会被检测到。可能是什么问题?
答案 0 :(得分:1)
VAR_USE
只能在VAR_DEF
失败时匹配(因为它是VAR_DEF
的前缀)。为了失败,后缀为
{WSS}{WORD}{WSS};
必须是无与伦比的。但是{WORD}
匹配任何不包含分号的字符串,即使它包含换行符也是如此。如果输入中的某个地方有分号,{VAR_DEF}
将匹配该分号。如果没有,{VAR_DEF}
将失败并且词法分析器将回退到{VAR_USE}
,但扫描程序无法告知在到达输入结束之前没有后续分号。 (即,当您键入ctl-D,然后按Enter键。)。