Проблемы со спецификацией lex

Я пытаюсь определить простой токенизатор для языка в lex.

По сути, я хочу определить токены для скобок, запятой, операций сравнения, операций в / con / ncon и логических операций. И я хочу, чтобы любой другой токен соответствовал регулярному выражению ключевых слов, так как это будет представлять STRINGARG на моем языке.

Каждый раз, когда я пытаюсь передать ему строку типа «A_FIELD», я получаю ОШИБКУ LEXER. Я хочу, чтобы он соответствовал ключевым словам и возвращал токен 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

lex
person sriaudacity    schedule 21.02.2011    source источник


Ответы (1)


Я нашел ответ на эту проблему.

По сути, я хотел, чтобы строковый аргумент был чем-то другим, кроме одного из распознанных токенов. Итак, когда я установил свое определение 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); }
%%
person sriaudacity    schedule 21.02.2011
comment
К вашему сведению, вы можете принять свои собственные ответы, чтобы вопрос не выглядел без ответа. - person Jack Kelly; 04.03.2011