SBSPSS/Utils/Scripter/parser.y
2000-12-08 20:42:35 +00:00

160 lines
3.4 KiB
Plaintext

%{
/****************************************************************************
parser.y
ParserWizard generated YACC file.
Date: 07 December 2000
****************************************************************************/
#include "lexer.h"
#include "codegen.h"
%}
/////////////////////////////////////////////////////////////////////////////
// declarations section
// parser name
%name myparser
// class definition
{
// place any extra class members here
}
// constructor
{
// place any extra initialisation code here
}
//// attribute type
//%include {
//#ifndef YYSTYPE
//#define YYSTYPE int
//#endif
//}
%union {
int variableIdx;
signed short value;
class CTreeNode *treenode;
}
// place any declarations here
%token STOP
%token IF
%token ELSE
%token PAUSE
%token PRINT
%token ASSIGN
%token EQUAL
%token NOTEQUAL
%token PLUS
%token END_STMT
%token OPEN_PAR
%token CLOSE_PAR
%token BEGIN_CS
%token END_CS
%token <variableIdx> VARIABLE
%token <value> VALUE
%type <treenode> program statement_list statement
%type <treenode> assign_expression
%type <treenode> expression equal_expression notequal_expression
%type <treenode> variable
%type <treenode> value
%%
/////////////////////////////////////////////////////////////////////////////
// rules section
// place your YACC rules here (there must be at least one)
program
:statement_list {s_baseTreeNode=$1;}
;
statement_list
:statement_list statement {$$=new CTreeNode(STMT_LIST,$1,$2);}
| {$$=new CTreeNode(EMPTY_STMT);}
;
statement
:END_STMT {$$=new CTreeNode(EMPTY_STMT);}
|STOP END_STMT {$$=new CTreeNode(STOP_STMT);}
|PAUSE END_STMT {$$=new CTreeNode(PAUSE_STMT);}
|PRINT OPEN_PAR value CLOSE_PAR END_STMT {$$=new CTreeNode(PRINT_STMT,$3);}
|assign_expression END_STMT {$$=$1;}
|IF OPEN_PAR expression CLOSE_PAR statement {$$=new CTreeNode(IF_STMT,$3,$5);}
|IF OPEN_PAR expression CLOSE_PAR statement ELSE statement {$$=new CTreeNode(IFELSE_STMT,$3,$5,$7);}
|BEGIN_CS statement_list END_CS {$$=new CTreeNode(STMT_LIST,$2);}
;
assign_expression
:variable ASSIGN value {$$=new CTreeNode(ASSIGN_EXPR,$1,$3);}
;
expression
:OPEN_PAR expression CLOSE_PAR {$$=$2;}
|equal_expression {$$=$1;}
|notequal_expression {$$=$1;}
;
equal_expression
:value EQUAL value {$$=new CTreeNode(EQUAL_EXPR,$1,$3);}
;
notequal_expression
:value NOTEQUAL value {$$=new CTreeNode(NOTEQUAL_EXPR,$1,$3);}
;
variable
:VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable id
;
value
:VALUE {$$=new CTreeNode(VALUE_EXPR,$1);}
|VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable value
|value PLUS value {$$=new CTreeNode(PLUS_EXPR,$1,$3);}
;
%%
/////////////////////////////////////////////////////////////////////////////
// programs section
int main(void)
{
int n=1;
openOutputFile("test.dat");
mylexer lexer;
myparser parser;
if(parser.yycreate(&lexer))
{
if(lexer.yycreate(&parser))
{
n=parser.yyparse();
}
}
if(s_baseTreeNode)
{
s_baseTreeNode->generateCode(true);
}
closeOutputFile();
return n;
}