rendered paste bodylexer:
%{
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include "wxfbt_parser.h"
#include "test1.tab.h"
%}
%option noyywrap
%option always-interactive
prefix ^[ \t]*%
%%
<<EOF>> 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