This commit is contained in:
parent
aae2e8e05f
commit
1f1398f7bc
8 changed files with 975 additions and 0 deletions
159
Utils/Scripter/parser.y
Normal file
159
Utils/Scripter/parser.y
Normal file
|
@ -0,0 +1,159 @@
|
|||
%{
|
||||
/****************************************************************************
|
||||
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;
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue