有lex规范的问题

时间:2011-02-21 19:07:18

标签: lex

我正在尝试为lex中的语言定义一个简单的标记化器。

基本上,我想为括号,逗号,比较操作,/ con / ncon操作和逻辑操作定义标记。我希望任何其他令牌匹配'关键字'正则表达式,因为这将代表我语言中的STRINGARG。

每当我尝试给它输入一个像'A_FIELD'这样的字符串时,它就会给我一个LEXER ERROR。我希望它匹配'关键字'并返回STRINGARG令牌。

这是我的.l文件:

%{
#include "y.tab.h"
%}

lparen "("
rparen ")"
comma ","
comparison ("=="|"!="|">"|"<"|">="|"<=")
intok ("in"|"IN")
conncontok ("con"|"CON"|"ncon"|"NCON")
logical ("and"|"or"|"AND"|"OR"|"&"|"|")
keywords ( "(" | ")" | "," | "==" | "!=" | ">" | "<" | ">=" | "<=" | "in" | "IN" | "con" | "CON" | "ncon" | "NCON" | "and" | "AND" | "&" | "or"\
 | "OR" | "|" )

%%

" "                    /* ignore whitespace */
{lparen}               { return LPAREN; }
{rparen}               { return RPAREN; }
{comma}                { return COMMA; }
{comparison}           { yylval.str = yytext; return COMPARISON; }
{intok}                { return IN; }
{conncontok}           { yylval.str = yytext; return CONNCON; }
{logical}              { return LOGICAL; }
^keywords              { yylval.str = yytext; return STRINGARG; }
.                      { printf("LEXER ERROR."); exit(1); }

%%

#ifndef yywrap
int yywrap() { return 1; }
#endif

1 个答案:

答案 0 :(得分:1)

我找到了这个问题的答案。

基本上我希望stringarg不是其中一个识别的标记。因此,当我按如下方式设置我的lex定义时,一切都很顺利。我应该在最后一条规则中使用字符类,而不是标记:

%%

" "                    /* ignore whitespace */
{lparen}               { return LPAREN; }
{rparen}               { return RPAREN; }
{comma}                { return COMMA; }
{comparison}           { yylval.str = yytext; return COMPARISON; }
{intok}                { return IN; }
{conncontok}           { yylval.str = yytext; return CONNCON; }
{logical}              { return LOGICAL; }
**[^ \t\n]+              { yylval.str = yytext; return STRINGARG; }**
.                      { printf( "Lexer error." ); exit(1); }
%%