Грамматика языка Pascal: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 8: Строка 8:




%union {  
%union  
 
{  
public double dVal;  
  public double dVal;  
       
  public string sVal;  
public string sVal;  
  public int iVal;  
       
  public ExprNode eVal;
public int iVal;  
  public List<ExprNode> elVal;        
       
  public TreeNode tVal;
public ExprNode eVal;
  public BlockNode lVal;
       
  public GreatType dtVal;        
public List<ExprNode> elVal;
  public List<string> lsVal;
       
public TreeNode tVal;
       
public BlockNode lVal;
public GreatType dtVal;
       
public List<string> lsVal;
 
}
}




%using System.IO
%using System.IO
%using SimpleCompiler
%using SimpleCompiler
%namespace LexScanner
%namespace LexScanner


Строка 41: Строка 30:


%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT   
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT   
%token PLUS MINUS MULT DIVIDE  
%token PLUS MINUS MULT DIVIDE  
%token AND OR NOT LT GT EQ NE LE GE DIV MOD
%token AND OR NOT LT GT EQ NE LE GE DIV MOD
%token <iVal> INTNUM  
%token <iVal> INTNUM  
%token <dVal> REALNUM  
%token <dVal> REALNUM  
%token <sVal> STRINGLITERAL
%token <sVal> STRINGLITERAL
%token <sVal> ID
%token <sVal> ID
%token <dtVal> kREAL kINTEGER  
%token <dtVal> kREAL kINTEGER  
%type <iVal> funcid
%type <iVal> funcid
%type <eVal> expr funccall
%type <eVal> expr funccall
%type <tVal> stat elsepart
%type <tVal> stat elsepart
%type <lVal> liststat progr
%type <lVal> liststat progr
%type <lsVal> listid  
%type <lsVal> listid  
%type <elVal> exprlist  
%type <elVal> exprlist  
%type <dtVal> ktype kSimpleType
%type <dtVal> ktype kSimpleType




%left LT GT LE GE EQ NE
%left LT GT LE GE EQ NE
%left MINUS PLUS OR
%left MINUS PLUS OR
%left MULT DIVIDE AND DIV MOD
%left MULT DIVIDE AND DIV MOD
%left UMINUS NOT
%left UMINUS NOT


%%
%%


progr  : defss kBEGIN liststat kEND  
progr  : defss kBEGIN liststat kEND  
| error   
| error   
;
;


defss : defs  
defss : defs  
|defss defs
|defss defs
 
        |
|
 
;
;
defs : kVAR listid COLON ktype SEMICOLUMN  
defs : kVAR listid COLON ktype SEMICOLUMN  
;
;


listid  : ID
listid  : ID
|listid COLUMN ID  
|listid COLUMN ID  
;
;
liststat    :  stat  
liststat    :  stat  
|  liststat SEMICOLUMN stat  
|  liststat SEMICOLUMN stat  
         ;
         ;


ktype : kSimpleType
ktype : kSimpleType
| error  
| error  
;
;


kSimpleType : kREAL  
kSimpleType : kREAL  
| kINTEGER  
| kINTEGER  
;
;


stat: { $$ = new Node(@$);}
stat: { $$ = new Node(@$);}
| ID ASSIGN expr  
| ID ASSIGN expr  
| ID LQPAREN expr RQPAREN ASSIGN expr
| ID LQPAREN expr RQPAREN ASSIGN expr
| kWHILE expr kDO stat
| kWHILE expr kDO stat
| kIF expr kTHEN stat elsepart
| kIF expr kTHEN stat elsepart
{
{
$$ = new IfNode($2,$4,$5,@$);
$$ = new IfNode($2,$4,$5,@$);
}
}
| kBEGIN liststat kEND { $$ = $2;}
| kBEGIN liststat kEND { $$ = $2;}
         ;
         ;


elsepart: {$$ = null;}
elsepart: {$$ = null;}
| kELSE stat
| kELSE stat
;
;
exprlist : expr  
exprlist : expr  
| exprlist COLUMN expr
| exprlist COLUMN expr
;
;


expr:    INTNUM
expr:    INTNUM
       | REALNUM   
       | REALNUM   
 
       | ID
       | ID
       | ID LQPAREN expr RQPAREN   
       | ID LQPAREN expr RQPAREN   
   
       | expr PLUS expr
       | expr PLUS expr
       | expr MINUS expr  
       | expr MINUS expr  
     
       | expr MULT expr   
       | expr MULT expr   
   
       | expr DIVIDE expr   
       | expr DIVIDE expr   
     
       | expr DIV expr
       | expr DIV expr
       | expr MOD expr     
       | expr MOD expr     
   
       | expr AND expr
       | expr AND expr
       | expr OR expr   
       | expr OR expr   
   
       | expr LT expr
       | expr LT expr
       | expr GT expr   
       | expr GT expr   
   
       | expr LE expr
       | expr LE expr  
     
       | expr GE expr   
       | expr GE expr   
     
       | expr EQ expr   
       | expr EQ expr   
     
       | expr NE expr   
       | expr NE expr   
   
       | NOT expr  
       | NOT expr  
       | MINUS expr %prec UMINUS
       | MINUS expr %prec UMINUS
       | LPAREN expr RPAREN
       | LPAREN expr RPAREN
       ;
       ;


%%
%%
</pre>
</pre>

Версия от 14:33, 15 сентября 2011

%{
    Dictionary<string,double> vars = new Dictionary<string,double>();
%}


%output=myyacc.cs 


%union 
{ 
   public double dVal; 
   public string sVal; 
   public int iVal; 
   public ExprNode eVal;
   public List<ExprNode> elVal;         
   public TreeNode tVal;
   public BlockNode lVal;	 
   public GreatType dtVal;         
   public List<string> lsVal;
}


%using System.IO
%using SimpleCompiler
%namespace LexScanner


%start progr

%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT  
%token PLUS MINUS MULT DIVIDE 
%token AND OR NOT LT GT EQ NE LE GE DIV MOD
%token <iVal> INTNUM 
%token <dVal> REALNUM 
%token <sVal> STRINGLITERAL
%token <sVal> ID
%token <dtVal> kREAL kINTEGER 
%type <iVal> funcid
%type <eVal> expr funccall
%type <tVal> stat elsepart
%type <lVal> liststat progr
%type <lsVal> listid 
%type <elVal> exprlist 
%type <dtVal> ktype kSimpleType


%left LT GT LE GE EQ NE
%left MINUS PLUS OR
%left MULT DIVIDE AND DIV MOD
%left UMINUS NOT

%%

progr   : defss kBEGIN liststat kEND 
	| error  
	;

defss : defs 
	|defss defs
        |
	;
	
defs : kVAR listid COLON ktype SEMICOLUMN 
	;	

listid  : ID	
	|listid COLUMN ID 
	;
	
liststat    :   stat 
	|   liststat SEMICOLUMN stat 
        ;

ktype : kSimpleType	
	| error 
	;

kSimpleType : kREAL 
	| kINTEGER 
	;

stat: { $$ = new Node(@$);}
	| ID ASSIGN expr 
	| ID LQPAREN expr RQPAREN ASSIGN expr
	| kWHILE expr kDO stat
	| kIF expr kTHEN stat elsepart
	{
		$$ = new IfNode($2,$4,$5,@$);
	}
	| kBEGIN liststat kEND { $$ = $2;}
        ;

elsepart: {$$ = null;}
	| kELSE stat
	;
	
exprlist : expr 
	 | exprlist COLUMN expr
	 ;

expr:    INTNUM
       | REALNUM   
       | ID
       | ID LQPAREN expr RQPAREN   
       | expr PLUS expr
       | expr MINUS expr 
       | expr MULT expr   
       | expr DIVIDE expr  
       | expr DIV expr
       | expr MOD expr    
       | expr AND expr
       | expr OR expr   
       | expr LT expr
       | expr GT expr  
       | expr LE expr  
       | expr GE expr  
       | expr EQ expr  
       | expr NE expr  
       | NOT expr 
       | MINUS expr %prec UMINUS
       | LPAREN expr RPAREN
       ;

%%