Blame gfs2/libgfs2/lexer.l

Packit 6ef888
%{
Packit 6ef888
#include "lang.h"
Packit 6ef888
#include "parser.h"
Packit 6ef888
Packit 6ef888
#define EXTRA ((struct lgfs2_lang_state *)yyextra)
Packit 6ef888
Packit 6ef888
#define P(token, type, text) do {\
Packit 6ef888
	*(yylval) = ast_new(type, text);\
Packit 6ef888
	if (*(yylval) == NULL) {\
Packit 6ef888
		EXTRA->ls_errnum = errno;\
Packit 6ef888
		return 1;\
Packit 6ef888
	}\
Packit 6ef888
	return (TOK_##token);\
Packit 6ef888
} while(0)
Packit 6ef888
Packit 6ef888
#define COLNUM EXTRA->ls_colnum
Packit 6ef888
#define YY_USER_ACTION COLNUM += yyleng;
Packit 6ef888
Packit 6ef888
%}
Packit 6ef888
%option bison-bridge reentrant
Packit 6ef888
%option warn debug
Packit 6ef888
%option nounput noinput
Packit 6ef888
%option noyywrap
Packit 6ef888
%option extra-type="struct lgfs2_lang_state *"
Packit 6ef888
Packit 6ef888
letter			[a-zA-Z_]
Packit 6ef888
decdigit		[0-9]
Packit 6ef888
decnumber		-?{decdigit}+
Packit 6ef888
hexdigit		[0-9a-fA-F]
Packit 6ef888
hexnumber		-?0x{hexdigit}+
Packit 6ef888
number			({decnumber}|{hexnumber})
Packit 6ef888
offset			\+{number}
Packit 6ef888
id			{letter}({letter}|{decdigit}|\.)*
Packit 6ef888
string			\'([^\']|\\\')*\'
Packit 6ef888
path			\'\/([^\']|\\\')*\'
Packit 6ef888
ccomment		\/\/.*\n
Packit 6ef888
shcomment		\#.*\n
Packit 6ef888
comment			({ccomment}|{shcomment})
Packit 6ef888
whitespace		[ \t\r]+
Packit 6ef888
Packit 6ef888
%%
Packit 6ef888
Packit 6ef888
\{			{
Packit 6ef888
			return TOK_LBRACE;
Packit 6ef888
			}
Packit 6ef888
\}			{
Packit 6ef888
			return TOK_RBRACE;
Packit 6ef888
			}
Packit 6ef888
\[			{
Packit 6ef888
			return TOK_LBRACKET;
Packit 6ef888
			}
Packit 6ef888
\]			{
Packit 6ef888
			P(RBRACKET, AST_EX_SUBSCRIPT, "[ ]");
Packit 6ef888
			}
Packit 6ef888
\,			{
Packit 6ef888
			return TOK_COMMA;
Packit 6ef888
			}
Packit 6ef888
\:			{
Packit 6ef888
			P(COLON, AST_EX_FIELDSPEC, yytext);
Packit 6ef888
			}
Packit 6ef888
\;			{
Packit 6ef888
			return TOK_SEMI;
Packit 6ef888
			}
Packit 6ef888
set			{
Packit 6ef888
			P(SET, AST_ST_SET, yytext);
Packit 6ef888
			}
Packit 6ef888
get			{
Packit 6ef888
			P(GET, AST_ST_GET, yytext);
Packit 6ef888
			}
Packit 6ef888
state			{
Packit 6ef888
			P(STATE, AST_KW_STATE, yytext);
Packit 6ef888
			}
Packit 6ef888
{path}			{
Packit 6ef888
			yytext[yyleng-1] = '\0';
Packit 6ef888
			P(PATH, AST_EX_PATH, yytext + 1);
Packit 6ef888
			}
Packit 6ef888
{string}		{
Packit 6ef888
			yytext[yyleng-1] = '\0';
Packit 6ef888
			P(STRING, AST_EX_STRING, yytext + 1);
Packit 6ef888
			}
Packit 6ef888
{offset}		{
Packit 6ef888
			P(OFFSET, AST_EX_OFFSET, yytext);
Packit 6ef888
			}
Packit 6ef888
{number}		{
Packit 6ef888
			P(NUMBER, AST_EX_NUMBER, yytext);
Packit 6ef888
			}
Packit 6ef888
{id}			{
Packit 6ef888
			P(ID, AST_EX_ID, yytext);
Packit 6ef888
			}
Packit 6ef888
{comment}		{
Packit 6ef888
			COLNUM = 0;
Packit 6ef888
			EXTRA->ls_linenum++;
Packit 6ef888
			}
Packit 6ef888
<<EOF>>			{
Packit 6ef888
			return 0;
Packit 6ef888
			}
Packit 6ef888
\n			{
Packit 6ef888
			COLNUM = 0;
Packit 6ef888
			EXTRA->ls_linenum++;
Packit 6ef888
			}
Packit 6ef888
{whitespace}		;
Packit 6ef888
.			{
Packit 6ef888
			printf("Unexpected character '%s' on line %d column %d\n",
Packit 6ef888
			       yytext, yylineno, COLNUM);
Packit 6ef888
			return 1;
Packit 6ef888
			}
Packit 6ef888
Packit 6ef888
%%