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

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
мНет описания правки
Строка 1: Строка 1:
'''Новый вариант'''
<pre>
<pre>
%{
%{
     Dictionary<string,double> vars = new Dictionary<string,double>();
     Dictionary<string,double> vars = new Dictionary<string,double>();
%}
%}
 
%union {
 
public int iVal;
%output=myyacc.cs
public double dVal;  
 
        public string sVal;  
 
        public ExprNode eVal;
%union  
        public List<ExprNode> elVal;
{
        public TreeNode tVal;
  public double dVal;  
        public BlockNode lVal;
  public string sVal;  
        public List<string> lsVal;
  public int iVal;
public GreatType dtVal;
  public ExprNode eVal;
      }
  public List<ExprNode> elVal;        
%output=PascalYacc.cs
  public TreeNode tVal;
  public BlockNode lVal;
  public GreatType dtVal;       
  public List<string> lsVal;
}
 
 
%using System.IO
%using System.IO
%using SimpleCompiler
%using Syntax_node_tree
%namespace LexScanner
%namespace LexScanner
%start progr
%start progr


%token kBEGIN kEND kIF kTHEN kELSE kWHILE kREPEAT kUNTIL kFOR kTO kDO kVAR kOF kARRAY
%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON LQPAREN RQPAREN MPOINT POINT   
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON 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
Строка 38: Строка 31:
%token <sVal> ID
%token <sVal> ID
%token <dtVal> kREAL kINTEGER  
%token <dtVal> kREAL kINTEGER  
%type <iVal> funcid
 
%type <eVal> expr funccall
%type <eVal> expr
%type <tVal> stat elsepart
%type <tVal> operator elsepart
%type <lVal> liststat progr
%type <lVal> listoperator progr  
%type <lsVal> listid
%type <lsVal> ident
%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
Строка 54: Строка 46:
%%
%%


progr  : defss kBEGIN liststat kEND  
progr  : {}
| error
| defss kBEGIN listoperator kEND {}
| error  
{
System.Console.WriteLine("BAD TEXT!!!");
break;
}
;
;


defss : defs  
defss : defs  
|defss defs
|defss defs
        |
|
;
;
defs : kVAR listid COLON ktype SEMICOLUMN  
defs : kVAR ident COLON ktype SEMICOLUMN {}
;
;


listid  : ID
ident  : ID {}
|listid COLUMN ID  
        |ident COLUMN ID {}
;
;
liststat   :  stat
listoperator   :  operator {}
liststat SEMICOLUMN stat
listoperator SEMICOLUMN operator {}
         ;
         ;


ktype : kSimpleType
ktype : kSimpleType
| error  
| error  
{
System.Console.WriteLine("BAD GREATE TYPE");
break;
}
;
;


kSimpleType : kREAL  
kSimpleType : kREAL {}
| kINTEGER  
| kINTEGER {}
;
;


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


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


expr:    INTNUM
expr:    INTNUM {}
      | REALNUM  
        | REALNUM {}
      | ID
        | STRINGLITERAL {}
      | ID LQPAREN expr RQPAREN 
        | ID {}   
      | 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>

Версия от 23:38, 21 сентября 2011

Новый вариант

%{
    Dictionary<string,double> vars = new Dictionary<string,double>();
%}
%union { 
	 public int iVal; 
	 public double dVal; 
         public string sVal; 
         public ExprNode eVal;
         public List<ExprNode> elVal;
         public TreeNode tVal;
         public BlockNode lVal;
         public List<string> lsVal;
	 public GreatType dtVal;
       }
%output=PascalYacc.cs 
%using System.IO
%using Syntax_node_tree
%namespace LexScanner
%start progr

%token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON 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 <eVal> expr
%type <tVal> operator elsepart
%type <lVal> listoperator progr 
%type <lsVal> ident 
%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 listoperator kEND {}
	| error 
	{ 
		System.Console.WriteLine("BAD TEXT!!!");
		break;
	} 
	;

defss : defs 
	|defss defs
	|
	;
	
defs : kVAR ident COLON ktype SEMICOLUMN {}
	;	

ident   : ID {}	
        |ident COLUMN ID {}
	;
	
listoperator    :   operator {}
	|   listoperator SEMICOLUMN operator {}
        ;

ktype : kSimpleType
	| error 
	{ 
		System.Console.WriteLine("BAD GREATE TYPE");
		break;
	}
	;

kSimpleType : kREAL {} 
	| kINTEGER {}
	;

operator: {}
	| ID ASSIGN expr {}
	| kWHILE expr kDO operator {}
	operator {}
	| kIF expr kTHEN operator elsepart {}
	| kBEGIN listoperator kEND {}
        ;

elsepart: {}
	| kELSE operator {}
	;

exprlist : expr {}
	| exprlist COLUMN expr {}
	;

expr:    INTNUM {}
        | REALNUM {}
        | STRINGLITERAL {}
        | ID {}    
    	| 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 {}
	;

%%