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