Создание парсеров на основе GPLEX+GPPG — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
Строка 81: Строка 81:
 
%%
 
%%
  
progr  : stlist
+
progr  : stlist {}
 
;
 
;
  
stlist : st
+
stlist : st {}
| stlist SEMICOLON st
+
| stlist SEMICOLON st {}
 
;
 
;
  
st : assign
+
st : assign {}
| comp
+
| comp {}
| cycl
+
| cycl {}
 
;
 
;
  
assign : ID ASSIGN expr
+
assign : ID ASSIGN expr {}
 
;
 
;
  
expr : ID
+
expr : ID {}
| INTNUM
+
| INTNUM {}
 
;
 
;
  
comp : BEGIN stlist END
+
comp : BEGIN stlist END {}
 
;
 
;
  
cycl : CYCLE expr st
+
cycl : CYCLE expr st {}
 
;
 
;
  

Версия 11:39, 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 TreeNode tVal;
         }

%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 {}
	;

%%