Я пытаюсь определить простой токенизатор для языка в lex.
По сути, я хочу определить токены для скобок, запятой, операций сравнения, операций in / 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