Создание парсеров на основе GPLEX+GPPG
Материал из Вики ИТ мехмата ЮФУ
Версия от 08:15, 26 апреля 2012; 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…»)
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
;
%%