Грамматика языка 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 ; %%