我正在尝试构建一个应该避免引用字符序列的lex程序。不喜欢的东西(“:=”)。到目前为止我写过这个,但似乎无法获得所需的输出:
/* 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 '#'
我希望程序避免使用“:=”作为一个整体,但它仍然会读取单个字符“:”。我该如何纠正?
答案 0 :(得分:0)
以下小完整(f)lex程序正是所期望的。 flex不会重新扫描匹配的令牌,除非你要求它(当然,你的代码中有一些未定义的行为会破坏flex的内部数据结构。)
%{
#include <stdio.h>
%}
%option nodefault noyywrap noinput nounput
%%
[[:space:]]+ /* Ignore spaces */
":=" {printf("Found - %s\n",yytext);}
. {printf("Error: Unmatched symbol \'%s\'\n", yytext);}
将上述文件存储在only:=.l
中,我会执行以下操作:
$ lex -o only:=.c only:=.l
$ gcc -o only:= -Wall only:=.c -lfl
$ ./only:=
:= & | #
Found - :=
Error: Unmatched symbol '&'
Error: Unmatched symbol '|'
Error: Unmatched symbol '#'
(-lfl
添加了main()
)