Lex:避免使用引用的表达方式

时间:2016-01-27 19:27:12

标签: regex quotes lex

我正在尝试构建一个应该避免引用字符序列的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 '#'

我希望程序避免使用“:=”作为一个整体,但它仍然会读取单个字符“:”。我该如何纠正?

1 个答案:

答案 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()

的最小定义