【问题标题】:Lex pattern doesn't react to inputsLex 模式对输入没有反应
【发布时间】:2016-11-17 20:40:25
【问题描述】:

我定义了以下别名:

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";

当我运行程序并开始写单词时,每当我写出应该被第二条规则检测到的单词时,它才会做出反应,直到我写出被第一条规则检测到的单词。 (它不会回显也不会检测到)
例如,这是一个短期运行的屏幕截图:

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

【问题讨论】:

  • 我看不出该 lex 规范如何产生该输出。 VAR_DEF 需要两个连续的冒号,而您的输入只有一个。
  • 糟糕,我复制错了。虽然它仍然没有解释它没有被回应。

标签: flex-lexer lex


【解决方案1】:

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

{WSS}{WORD}{WSS};

必须是无与伦比的。但是{WORD} 匹配任何不包含分号的字符串,即使它包含换行符。如果输入中有分号,{VAR_DEF} 将匹配该分号。如果没有,{VAR_DEF} 将失败,词法分析器将回退到{VAR_USE},但扫描仪在到达输入末尾之前无法判断没有后面的分号。 (即,当您键入 ctl-D 后按 Enter 时。)。

【讨论】:

  • 我明白了,那么我怎样才能让 lex 采用 {VAR_USE} 以便在它看到以“:”结尾的字符串但当前找不到更长的匹配规则时匹配?
  • @enemy:首先明确说明“不匹配”的含义。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 2021-11-09
  • 2016-10-11
  • 2023-01-25
  • 2018-12-01
  • 2020-03-08
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多