%option stack %x STR_STATE %{ #include #include "configuration.tab.h" int line_number = 1; extern "C" void yyerror(const char *str); %} %% "\"" { yylval.name = new string(); yy_push_state(STR_STATE); } { "\"" { /* saw closing quote - all done */ yy_pop_state(); return NAME; } "\\"[0-7]{1,3} { /* octal escape sequence */ int result; sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) { char errbuf[100]; sprintf(errbuf, "octal constant '%s' out of bounds", yytext+1); yyerror(errbuf); } (*yylval.name) += result; } "\\"[0-9]+ { char errbuf[100]; sprintf(errbuf, "octal constant '%s' out of bounds", yytext+1); yyerror(errbuf); } "\\n" { *(yylval.name) += "\n"; } "\\t" { *(yylval.name) += "\t"; } "\\r" { *(yylval.name) += "\r"; } "\\b" { *(yylval.name) += "\b"; } "\\f" { *(yylval.name) += "\f"; } "\\"(.|\n) { *(yylval.name) += yytext+1; } [^"\""\\]+ { (*yylval.name) += yytext; } <> yyerror("End of file reached but string was never terminated"); } #.*$ ; "section" return CLASSKEYWORD; "configuration" return SUBROUTINEKEYWORD; "call" return CALLKEYWORD; "inherit" return USINGKEYWORD; "{" return *yytext; "}" return *yytext; "=" return *yytext; ":" return *yytext; [^ "\""\t\n\{\}=]+ { yylval.name = new string(yytext); return NAME; } "\n" line_number++; [ \t] ; %%