Грамматика языка Pascal

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
%{
    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

       ;

%%