pascalabcnet/Grammars/KuMir-gppg/KuMir00.lex
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

153 lines
4.1 KiB
Plaintext
Raw Permalink Blame History

%namespace GPPGParserScanner
%using PascalABCCompiler.KuMir00Parser;
%using PascalABCCompiler.SyntaxTree;
Alpha [[:IsLetter:]_]
Digit [0-9]
AlphaDigit [[:IsLetterOrDigit:]_]
INTNUM {Digit}+
ID {Alpha}{AlphaDigit}*
REAL {INTNUM}\.{INTNUM}
LINECOMMENT |.*
STRING \'[^'\n]*\'|\"[^"\n]*\"
CHAR '[^"\\\r\n]{1}(?:\\.[^"\\\r\n]*)*'
ENDL [\n|\r\n?]*
%%
{LINECOMMENT} {
BEGIN(INITIAL);
}
\x02 { return (int)Tokens.TK_NEWLINE; }
"**" { return (int)Tokens.TK_POWER; }
":=" { return (int)Tokens.ASSIGN; }
";" { return (int)Tokens.SEMICOLUMN; }
"-" { return (int)Tokens.MINUS; }
"+" { return (int)Tokens.PLUS; }
"*" { return (int)Tokens.MULT; }
"/" { return (int)Tokens.DIVIDE; }
"<" { return (int)Tokens.LT; }
">" { return (int)Tokens.GT; }
"<=" { return (int)Tokens.LE; }
">=" { return (int)Tokens.GE; }
"=" { return (int)Tokens.EQ; }
"<>" { return (int)Tokens.NE; }
"(" { return (int)Tokens.LPAREN; }
")" { return (int)Tokens.RPAREN; }
"," { return (int)Tokens.COLUMN; }
"." { return (int)Tokens.COMMA; }
":" { return (int)Tokens.COLON; }
"[" { return (int)Tokens.TK_SQUARE_OPEN; }
"]" { return (int)Tokens.TK_SQUARE_CLOSE; }
\x01 { return (int)Tokens.INVISIBLE; }
{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;
}
{REAL} {
//yylval.rVal = PT.create_double_const(yytext, yylloc);
yylval.rVal = double.Parse(yytext,new System.Globalization.CultureInfo("en-US"));
return (int)Tokens.REAL;
}
{CHAR} {
yylval.chVal = yytext[1];
return (int)Tokens.CHAR;
}
{STRING} {
yylval.sVal = yytext.Substring(1,yytext.Length - 2);
return (int)Tokens.STRING;
}
{ENDL} {
yylval.sVal = "\n";
return (int)Tokens.ENDL;
}
%{
yylloc = new QUT.Gppg.LexLocation(tokLin, tokCol, tokELin, tokECol);
%}
%%
public override void yyerror(string format, params object[] args)
{
string [] ww = new string[args.Length-1];
for (int i=1; i<args.Length; i++)
ww[i-1]=(string)args[i];
string w = string.Join(" <20><><EFBFBD> ",ww);
string errorMsg = string.Format("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {0}, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {1}", args[0], w);
PT.AddError(errorMsg,yylloc);
}
class ScannerHelper
{
private static Dictionary<string,int> keywords;
static ScannerHelper()
{
keywords = new Dictionary<string,int>();
keywords.Add("<22><>",(int)Tokens.TK_TRUE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_FALSE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_ALG);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_USES);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_ARG);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_VAR);
keywords.Add("<22><><EFBFBD><EFBFBD>",(int)Tokens.TK_FUNC_VAL);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_BEGIN);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_END);
keywords.Add("<22><>",(int)Tokens.TK_BEGIN_CYCLE);
keywords.Add("<22><>",(int)Tokens.TK_END_CYCLE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_ASSERT);
keywords.Add("<22><><EFBFBD><EFBFBD>",(int)Tokens.TK_READ);
keywords.Add("<22><><EFBFBD><EFBFBD><EFBFBD>",(int)Tokens.TK_WRITE);
keywords.Add("<22><>",(int)Tokens.TK_EOL);
keywords.Add("<22><><EFBFBD><EFBFBD>",(int)Tokens.TK_IF);
keywords.Add("<22><>",(int)Tokens.TK_THEN);
keywords.Add("<22><><EFBFBD><EFBFBD><EFBFBD>",(int)Tokens.TK_ELSE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_END_ALL);
keywords.Add("<22><><EFBFBD><EFBFBD><EFBFBD>",(int)Tokens.TK_CASE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_CASE_V);
keywords.Add("<22><>",(int)Tokens.TK_NOT);
keywords.Add("<22>",(int)Tokens.TK_AND);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_OR);
keywords.Add("<22><><EFBFBD><EFBFBD>",(int)Tokens.TK_WHILE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_FOR);
keywords.Add("<22><>",(int)Tokens.TK_FROM);
keywords.Add("<22><>",(int)Tokens.TK_TO);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_INTEGER_TYPE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_REAL_TYPE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_BOOLEAN_TYPE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_CHAR_TYPE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_STRING_TYPE);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_ARRAY);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_ISP);
keywords.Add("<22><><EFBFBD>",(int)Tokens.TK_RAZ);
}
public static int GetIDToken(string s)
{
if (keywords.ContainsKey(s))
return keywords[s];
else
return (int)Tokens.ID;
}
}