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

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


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 MULT expr      
       | expr MINUS expr  
       | expr DIVIDE expr      
        
       | expr MULT 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 LE expr         
       | expr GT expr
       | expr GE expr      
   
       | expr EQ expr      
       | expr LE expr  
       | expr NE expr      
        
       | expr GE expr
     
       | expr EQ expr
     
       | expr NE expr
   
       | NOT expr  
       | NOT expr  
       | MINUS expr %prec UMINUS
       | MINUS expr %prec UMINUS
       | LPAREN expr RPAREN
       | LPAREN expr RPAREN
       ;
       ;


%%
%%

Версия от 14:28, 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
      ;

%%