【发布时间】:2016-05-04 22:22:54
【问题描述】:
我正在尝试构建一个应该避免引用字符序列的 lex 程序。像 not(":=") 之类的东西。到目前为止,我已经写了这个,但似乎无法获得所需的输出:
/* Definitions */
assgn ":="
symbol [^{assgn}]
%%
.
":=" {printf("Found - %s\n",yytext);}
{symbol} {printf("Error: Unmatched symbol \'%s\'\n", yytext);}
%
输入:
:= & | #
输出:
Found - :=
Error: Unmatched symbol ':'
Error: Unmatched symbol '='
Error: Unmatched symbol '&'
Error: Unmatched symbol '|'
Error: Unmatched symbol '#'
期望的输出:
Found - :=
Error: Unmatched symbol '&'
Error: Unmatched symbol '|'
Error: Unmatched symbol '#'
我希望程序从整体上避免“:=”,但它仍然读取单个字符“:”。我该如何纠正这个问题?
【问题讨论】:
-
“避免”是什么意思?词法分析器必须匹配当前输入位置的 some 标记。它不搜索令牌。
-
是的,你是对的。原谅歧义。我的意思是它应该“匹配”表达式并将其吃掉,因为它前面有一个'^'。每当出现“:=”时,它应该吃掉整个表达式,而不是将“:”和“=”识别为不匹配的符号。
-
我不明白你在这种情况下所说的“吃”是什么意思。如果你想让 flex 识别 ":=" 并且在它看到它时什么都不做(即继续扫描它),那么你只需要使用一个什么都不做的动作(或者干脆忽略这个动作。)如果你的意思是别的,尝试用示例输入解释所需匹配的顺序。 (编辑问题。所需的精度不适合评论,无论如何这不是 cmets 的用途。)
-
例如,对于输入“:= * & |”,只有'*'、'&'和'|'应该由于“:=”的否定而被打印出来
-
我无法重现该问题。具有该输入的文件会产生所需的结果。我将删除仅包含
.的行并将{symbol}替换为.但对于示例输入,它没有区别。