Грамматика языка Pascal: различия между версиями
Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
AlexHit (обсуждение | вклад) Нет описания правки |
AlexHit (обсуждение | вклад) мНет описания правки |
||
Строка 1: | Строка 1: | ||
'''Новый вариант''' | |||
<pre> | <pre> | ||
%{ | %{ | ||
Dictionary<string,double> vars = new Dictionary<string,double>(); | Dictionary<string,double> vars = new Dictionary<string,double>(); | ||
%} | %} | ||
%union { | |||
public int iVal; | |||
public double dVal; | |||
public string sVal; | |||
public ExprNode eVal; | |||
%union | public List<ExprNode> elVal; | ||
public TreeNode tVal; | |||
public BlockNode lVal; | |||
public List<string> lsVal; | |||
public GreatType dtVal; | |||
} | |||
%output=PascalYacc.cs | |||
} | |||
%using System.IO | %using System.IO | ||
%using | %using Syntax_node_tree | ||
%namespace LexScanner | %namespace LexScanner | ||
%start progr | %start progr | ||
%token kBEGIN kEND kIF kTHEN kELSE kWHILE | %token kBEGIN kEND kIF kTHEN kELSE kWHILE kDO kVAR | ||
%token ASSIGN SEMICOLUMN LPAREN RPAREN COLUMN COLON | %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 <eVal> expr | %type <eVal> expr | ||
%type <tVal> | %type <tVal> operator elsepart | ||
%type <lVal> | %type <lVal> listoperator progr | ||
%type <lsVal> | %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 | progr : {} | ||
| error | | defss kBEGIN listoperator kEND {} | ||
| error | |||
{ | |||
System.Console.WriteLine("BAD TEXT!!!"); | |||
break; | |||
} | |||
; | ; | ||
defss : defs | defss : defs | ||
|defss defs | |defss defs | ||
| | |||
; | ; | ||
defs : kVAR | defs : kVAR ident COLON ktype SEMICOLUMN {} | ||
; | ; | ||
ident : ID {} | |||
|ident COLUMN ID {} | |||
; | ; | ||
listoperator : operator {} | |||
| | | listoperator SEMICOLUMN operator {} | ||
; | ; | ||
ktype : kSimpleType | ktype : kSimpleType | ||
| error | | error | ||
{ | |||
System.Console.WriteLine("BAD GREATE TYPE"); | |||
break; | |||
} | |||
; | ; | ||
kSimpleType : kREAL | kSimpleType : kREAL {} | ||
| kINTEGER | | kINTEGER {} | ||
; | ; | ||
operator: {} | |||
| ID ASSIGN expr | | ID ASSIGN expr {} | ||
| | | kWHILE expr kDO operator {} | ||
operator {} | |||
| kIF expr kTHEN | | kIF expr kTHEN operator elsepart {} | ||
| kBEGIN listoperator kEND {} | |||
| kBEGIN | |||
; | ; | ||
elsepart: { | elsepart: {} | ||
| | | kELSE operator {} | ||
; | |||
exprlist : expr {} | |||
| exprlist COLUMN expr {} | |||
; | ; | ||
expr: INTNUM | 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 {} | |||
; | |||
%% | %% | ||
</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 {} ; %%