Грамматика языка Pascal: различия между версиями
Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
AlexHit (обсуждение | вклад) Нет описания правки |
AlexHit (обсуждение | вклад) Нет описания правки |
||
| Строка 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
;
%%