All pastes #366383 Raw Edit

Someone

public text v1 · immutable
#366383 ·published 2007-02-21 17:25 UTC
rendered paste body
lexer:

%{
#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