lexer: %{ #include #include #include #include "wxfbt_parser.h" #include "test1.tab.h" %} %option noyywrap %option always-interactive prefix ^[ \t]*% %% <> yyterminate(); {prefix}-.*$ yylval.s_value = new std::string(yytext); return COMMENT; {prefix}var return VAR; {prefix}set return SET; {prefix}if return IF; {prefix}else return ELSE; {prefix}end_if return END_IF; {prefix}embed return EMBED; {prefix}at return AT; {prefix}atstart return ATSTART; {prefix}atend return ATEND; {prefix}end_at return END_AT; {prefix}cache return CACHE; {prefix}commit return COMMIT; {prefix}rollback return ROLLBACK; {prefix}end_cache return END_CACHE; {prefix}template return TEMPLATE; {prefix}object_classes return OBJECT_CLASSES; {prefix}end_template return END_TEMPLATE; "<=" return LE; ">=" return GE; "==" return EQ; "!=" return NE; "<" return LT; ">" return GT; "+" return OP_PLUS; "-" return OP_MINUS; "*" return OP_MUL; "/" return OP_DIV; "%" return OP_MOD; [a-zA-Z_][0-9a-zA-Z_]* yylval.s_value = new std::string(yytext); return LABEL; ^[ \t]*$ yylval.s_value = new std::string(yytext); return TEXT; ^[ \t]*[^% \t\n][^\n]*$ yylval.s_value = new std::string(yytext); return TEXT; [ \t]*\n yylval.s_value = new std::string(yytext); return REST_OF_LINE; [0-9]+ { yylval.r_value = atof(yytext); return NUMBER; } . {} %% -- input to parser: %template project %object_classes Project %embed h %embed cpp %end_template %template window %object_classes Dialog Frame %at h class $object.name { %embed class_h }; %end_at %at cpp $object.name::$object.name { %embed class_ctor } %embed handlers %end_at %end_template %template button %object_classes Button wxButton %at class_h $object.class *$object.name; %end_at %at class_ctor $object.name = new $object.class( ..... ); %end_at %at handlers %cache $parent(1).name::On_$object.name() { %embed handler } %end_cache %end_at %end_template %template close_window %object_classes Button wxButton wxMenuItem %at class_h void On_$object.name(); %end_at %at handler //closes $parent(1).name if $object.name has been clicked Close(); %end_at %end_template