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