Создание парсеров на основе GPLEX+GPPG — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
Строка 55: | Строка 55: | ||
− | SimpleYacc.yacc | + | ===SimpleYacc.yacc=== |
<pre>%{ | <pre>%{ | ||
Строка 67: | Строка 67: | ||
public string sVal; | public string sVal; | ||
public Node nVal; | public Node nVal; | ||
+ | public stlistVal StatementList; | ||
} | } | ||
Строка 81: | Строка 82: | ||
%type <nVal> expr assign st comp cycl | %type <nVal> expr assign st comp cycl | ||
+ | %type <stlistVal> stlist | ||
+ | |||
%% | %% |
Версия 12:00, 26 апреля 2012
Комплект разработчика парсеров
SimpleLex.lex
%namespace LexScanner Alpha [a-zA-Z_] INTNUM [0-9]+ REALNUM {INTNUM}\.{INTNUM} ID [a-zA-Z_][a-zA-Z0-9_]* %% ":=" { return (int)Tokens.ASSIGN; } ";" { return (int)Tokens.SEMICOLON; } {ID} { int res = ScannerHelper.GetIDToken(yytext); if (res == (int)Tokens.ID) yylval.sVal = yytext; return res; } {INTNUM} { yylval.iVal = int.Parse(yytext); return (int)Tokens.INTNUM; } %% class ScannerHelper { private static Dictionary<string,int> keywords; static ScannerHelper() { keywords = new Dictionary<string,int>(); keywords.Add("begin",(int)Tokens.BEGIN); keywords.Add("end",(int)Tokens.END); keywords.Add("cycle",(int)Tokens.CYCLE); } public static int GetIDToken(string s) { if (keywords.ContainsKey(s.ToLower())) return keywords[s]; else return (int)Tokens.ID; } }
SimpleYacc.yacc
%{ Dictionary<string,double> vars = new Dictionary<string,double>(); %} %output = SimpleYacc.cs %union { public double dVal; public int iVal; public string sVal; public Node nVal; public stlistVal StatementList; } %using System.IO %namespace LexScanner %start progr %token BEGIN END CYCLE ASSIGN SEMICOLON %token <iVal> INTNUM %token <sVal> ID %type <nVal> expr assign st comp cycl %type <stlistVal> stlist %% progr : stlist {} ; stlist : st { $$ = new StatementList($1);} | stlist SEMICOLON st {} ; st : assign {$$=$1;} | comp {$$=$1;} | cycl {$$=$1;} ; assign : ID ASSIGN expr {$$ = new AssignNode($1 as IDNode,$3 as ExprNode,AssignOpType.lexAssign);} ; expr : ID {$$ = new IDNode($1);} | INTNUM {$$ = new NumNode($1);} ; comp : BEGIN stlist END {} ; cycl : CYCLE expr st {} ; %%