Создание парсеров на основе GPLEX+GPPG — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→SimpleYacc.yacc) |
Admin (обсуждение | вклад) |
||
Строка 3: | Строка 3: | ||
[http://pascalabc.net/downloads/CompilerConstruction/SimplePas0.zip Комплект разработчика парсеров] | [http://pascalabc.net/downloads/CompilerConstruction/SimplePas0.zip Комплект разработчика парсеров] | ||
− | SimpleLex.lex | + | ===SimpleLex.lex=== |
− | <pre>%namespace | + | <pre>%namespace SimpleScanner |
+ | |||
+ | %using SimpleParser; | ||
+ | %using QUT.Gppg; | ||
Alpha [a-zA-Z_] | Alpha [a-zA-Z_] | ||
Строка 16: | Строка 19: | ||
":=" { return (int)Tokens.ASSIGN; } | ":=" { return (int)Tokens.ASSIGN; } | ||
";" { return (int)Tokens.SEMICOLON; } | ";" { return (int)Tokens.SEMICOLON; } | ||
+ | "-=" { return (int)Tokens.ASSIGNMINUS; } | ||
+ | "+=" { return (int)Tokens.ASSIGNPLUS; } | ||
+ | "*=" { return (int)Tokens.ASSIGNMULT; } | ||
{ID} { | {ID} { | ||
Строка 28: | Строка 34: | ||
return (int)Tokens.INTNUM; | return (int)Tokens.INTNUM; | ||
} | } | ||
+ | |||
+ | %{ | ||
+ | yylloc = new LexLocation(tokLin, tokCol, tokELin, tokECol); | ||
+ | %} | ||
%% | %% | ||
Строка 50: | Строка 60: | ||
} | } | ||
− | } | + | } |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</pre> | </pre> |
Версия 10:01, 9 мая 2012
Комплект разработчика парсеров
SimpleLex.lex
%namespace SimpleScanner %using SimpleParser; %using QUT.Gppg; 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; } %{ 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.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; } }