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