Создание парсеров на основе GPLEX+GPPG — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (Новая страница: «SimpleLex.lex <source lang="">%namespace LexScanner Alpha [a-zA-Z_] INTNUM [0-9]+ REALNUM {INTNUM}\.{INTNUM} ID [a-zA-Z_][a-zA-Z0-9_]* %% ":=" { return (int)T…») |
Admin (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
SimpleLex.lex | SimpleLex.lex | ||
− | < | + | <pre>%namespace LexScanner |
Alpha [a-zA-Z_] | Alpha [a-zA-Z_] | ||
Строка 58: | Строка 58: | ||
} | } | ||
− | } | + | }</pre> |
− | </ | ||
SimpleYacc.yacc | SimpleYacc.yacc | ||
− | < | + | |
+ | <pre>%{ | ||
Dictionary<string,double> vars = new Dictionary<string,double>(); | Dictionary<string,double> vars = new Dictionary<string,double>(); | ||
%} | %} | ||
Строка 116: | Строка 116: | ||
%% | %% | ||
− | </ | + | </pre> |
Версия 11:10, 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; } "-=" { return (int)Tokens.ASSIGNMINUS; } "+=" { return (int)Tokens.ASSIGNPLUS; } "*=" { return (int)Tokens.ASSIGNMULT; } {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; } {REALNUM} { yylval.dVal = double.Parse(yytext,new System.Globalization.CultureInfo("en-US")); return (int)Tokens.REALNUM; } %{ yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol); %} %% class ScannerHelper { private static Dictionary<string,int> keywords; static ScannerHelper() { keywords = new Dictionary<string,int>(); keywords.Add("begin",(int)Tokens.kBEGIN); keywords.Add("end",(int)Tokens.kEND); keywords.Add("cycle",(int)Tokens.kIF); } 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 ExprNode eVal; public List<ExprNode> elVal; public TreeNode tVal; public BlockNode lVal; } %using System.IO %namespace LexScanner %start progr %token BEGIN END CYCLE ASSIGN SEMICOLON %token <iVal> INTNUM %token <sVal> ID %% progr : stlist ; stlist : st | stlist SEMICOLON st ; st : assign | comp | cycl ; assign : ID ASSIGN expr ; expr : ID | INTNUM ; comp : BEGIN stlist END ; cycl : CYCLE expr st ; %%