[Xorp-hackers] [PATCH 04/15] xorp: policy: REname policy.l to policy.ll

igorm at etf.rs igorm at etf.rs
Fri Aug 31 04:33:50 PDT 2012


From: Igor Maravic <igorm at etf.rs>


Signed-off-by: Igor Maravic <igorm at etf.rs>
---
 xorp/policy/policy.l  |  222 -----------------------------------------------
 xorp/policy/policy.ll |  228 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 228 insertions(+), 222 deletions(-)
 delete mode 100644 xorp/policy/policy.l
 create mode 100644 xorp/policy/policy.ll

diff --git a/xorp/policy/policy.l b/xorp/policy/policy.l
deleted file mode 100644
index 0f2c58c..0000000
--- a/xorp/policy/policy.l
+++ /dev/null
@@ -1,222 +0,0 @@
-%{
-
-#include <vector>
-#include <string>
-#include <sstream>
-
-#include "policy_module.h"
-#include "libxorp/xorp.h"
-#include "policy/common/policy_utils.hh"
-#include "policy_parser.hh"
-#include "yacc.yy_policy_parser.cc.h"
-
-#define yylval yy_policy_parserlval
-#define yyerror yy_policy_parsererror
-#define yyparse yy_policy_parserparse
-
-void yyerror(const char *m);
-extern int yyparse(void);
-
-using namespace policy_parser;
-
-// instantiate the globals here.
-vector<Node*>* policy_parser::_parser_nodes;
-unsigned policy_parser::_parser_lineno;
-
-// try not to pollute
-namespace {
-	string _last_error;
-	Term::BLOCKS _block;
-}
-
-%}
-
-%option prefix="yy_policy_parser"
-%option outfile="lex.yy_policy_parser.cc"
-%option noyywrap
-%option nounput
-%option never-interactive
-%x STR
-
-RE_IPV4_BYTE 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?
-RE_IPV4 {RE_IPV4_BYTE}\.{RE_IPV4_BYTE}\.{RE_IPV4_BYTE}\.{RE_IPV4_BYTE}
-RE_IPV4_PREFIXLEN 3[0-2]|[0-2]?[0-9]
-RE_IPV4NET {RE_IPV4}\/{RE_IPV4_PREFIXLEN}
-
-RE_H4 [a-fA-F0-9]{1,4}
-RE_H4_COLON {RE_H4}:
-RE_LS32 (({RE_H4}:{RE_H4})|{RE_IPV4})
-RE_IPV6_P1      {RE_H4_COLON}{6}{RE_LS32}
-RE_IPV6_P2      ::{RE_H4_COLON}{5}{RE_LS32}
-RE_IPV6_P3      ({RE_H4})?::{RE_H4_COLON}{4}{RE_LS32}
-RE_IPV6_P4      ({RE_H4_COLON}{0,1}{RE_H4})?::{RE_H4_COLON}{3}{RE_LS32}
-RE_IPV6_P5      ({RE_H4_COLON}{0,2}{RE_H4})?::{RE_H4_COLON}{2}{RE_LS32}
-RE_IPV6_P6      ({RE_H4_COLON}{0,3}{RE_H4})?::{RE_H4_COLON}{1}{RE_LS32}
-RE_IPV6_P7      ({RE_H4_COLON}{0,4}{RE_H4})?::{RE_LS32}
-RE_IPV6_P8      ({RE_H4_COLON}{0,5}{RE_H4})?::{RE_H4}
-RE_IPV6_P9      ({RE_H4_COLON}{0,6}{RE_H4})?::
-RE_IPV6 	{RE_IPV6_P1}|{RE_IPV6_P2}|{RE_IPV6_P3}|{RE_IPV6_P4}|{RE_IPV6_P5}|{RE_IPV6_P6}|{RE_IPV6_P7}|{RE_IPV6_P8}|{RE_IPV6_P9}
-RE_IPV6_PREFIXLEN 12[0-8]|1[01][0-9]|[0-9][0-9]?
-RE_IPV6NET      {RE_IPV6}\/{RE_IPV6_PREFIXLEN}
-
-%%
-
-[[:digit:]]+".."[[:digit:]]+	{ yylval.c_str = strdup(yytext);
-		  return YY_UINTRANGE;
-		}  
-
-[[:digit:]]+	{ yylval.c_str = strdup(yytext);
-		  return YY_UINT;
-		}  
-
--[[:digit:]]+	{ yylval.c_str = strdup(yytext);
-		  return YY_INT;
-		}  
-
-"true"		{ yylval.c_str = strdup(yytext);
-		  return YY_BOOL;
-		}  
-
-"false"		{ yylval.c_str = strdup(yytext);
-		  return YY_BOOL;
-		}  
-
-\"|\'		BEGIN(STR);
-
-<STR>\"|\'	BEGIN(INITIAL);
-		
-<STR>[^\"\']+	{ yylval.c_str = strdup(yytext); 
-		  _parser_lineno += policy_utils::count_nl(yytext);
-		  /* XXX: a string can be started with " but terminated with '
-		   * and vice versa...
-		   */ 
-		  return YY_STR;
-		}
-
-{RE_IPV4}".."{RE_IPV4}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV4RANGE;
-		}
-
-{RE_IPV4}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV4;
-		}
-
-{RE_IPV4NET}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV4NET;
-		}
-
-		
-{RE_IPV6}".."{RE_IPV6}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV6RANGE;
-		}
-
-{RE_IPV6}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV6;
-		}
-
-{RE_IPV6NET}	{
-		  yylval.c_str = strdup(yytext);
-		  return YY_IPV6NET;
-		}
-
-":"		{
-		  // the colon is an alias for asignment in action and equality
-		  // in the source / dest blocks.
-		  if (_block == Term::ACTION)
-		  	return YY_ASSIGN;
-		  else
-		  	return YY_EQ;
-		}
-
-"("		return YY_LPAR;
-")"		return YY_RPAR;
-"=="		return YY_EQ; 
-"!="		return YY_NE;
-"<="		return YY_LE;
-">="		return YY_GE;
-"<"		return YY_LT;
-">"		return YY_GT;
-"+"		return YY_ADD;
-"*"		return YY_MUL;
-"\-"		return YY_SUB;
-"="		return YY_ASSIGN;
-"+="		return YY_PLUS_EQUALS;
-"-="		return YY_MINUS_EQUALS;
-"||"		return YY_OR;
-"&&"		return YY_AND;
-"!"		return YY_NOT;
-
-"exact"		return YY_IPNET_EQ;
-"longer"	return YY_IPNET_LT;
-"shorter"	return YY_IPNET_GT;
-"orlonger"	return YY_IPNET_LE;
-"orshorter"	return YY_IPNET_GE;
-"and"		return YY_AND;
-"or"		return YY_OR;
-"xor"		return YY_XOR;
-"not"		return YY_NOT;
-"add"		return YY_PLUS_EQUALS;
-"sub"		return YY_MINUS_EQUALS;
-"head"		return YY_HEAD;
-"ctr"		return YY_CTR;
-"ne_int"	return YY_NE_INT;
-"accept"	return YY_ACCEPT;
-"reject"	return YY_REJECT;
-"SET"		return YY_SET;
-"REGEX"		return YY_REGEX;
-"protocol"	return YY_PROTOCOL;
-"next"		return YY_NEXT;
-"policy"	return YY_POLICY;
-"term"		return YY_TERM;
-
-[[:alpha:]][[:alnum:]_-]*		{ yylval.c_str = strdup(yytext);
-					  return YY_ID;
-					}  
-
-;		return YY_SEMICOLON;
-		  
-[[:blank:]]+	/* eat blanks */
-
-"\n"		_parser_lineno++;
-
-.		{ yyerror("Unknown character"); }
-
-%%
-
-void yyerror(const char *m)
-{
-        ostringstream oss;
-        oss << "Error on line " <<  _parser_lineno << " near (";
-
-	for(int i = 0; i < yyleng; i++)
-		oss << yytext[i];
-	oss << "): " << m;
-
-        _last_error = oss.str();
-}
-
-// Everything is put in the lexer because of YY_BUFFER_STATE...
-int 
-policy_parser::policy_parse(vector<Node*>& outnodes, const Term::BLOCKS& block, 
-			    const string& conf, string& outerr)
-{
-
-        YY_BUFFER_STATE yybuffstate = yy_scan_string(conf.c_str());
-
-        _last_error = "No error";
-        _parser_nodes = &outnodes;
-        _parser_lineno = 1;
-	_block = block;
-
-        int res = yyparse();
-        
-        yy_delete_buffer(yybuffstate);
-        outerr = _last_error;
-        
-        return res;
-}
diff --git a/xorp/policy/policy.ll b/xorp/policy/policy.ll
new file mode 100644
index 0000000..3f29934
--- /dev/null
+++ b/xorp/policy/policy.ll
@@ -0,0 +1,228 @@
+%{
+
+#include <vector>
+#include <string>
+#include <sstream>
+
+#include "policy/policy_module.h"
+#include "libxorp/xorp.h"
+#include "policy/common/policy_utils.hh"
+#include "policy/policy_parser.hh"
+
+#if defined(NEED_LEX_H_HACK)
+extern YYSTYPE tpltlval;
+#include "y.policy_parser_tab.cc.h"
+#else
+#include "y.policy_parser_tab.hh"
+#endif
+
+#define yylval policy_parserlval
+#define yyerror policy_parsererror
+#define yyparse policy_parserparse
+
+void yyerror(const char *m);
+extern int yyparse(void);
+
+using namespace policy_parser;
+
+// instantiate the globals here.
+vector<Node*>* policy_parser::_parser_nodes;
+unsigned policy_parser::_parser_lineno;
+
+// try not to pollute
+namespace {
+	string _last_error;
+	Term::BLOCKS _block;
+}
+
+%}
+
+%option prefix="policy_parser"
+%option outfile="lex.policy_parser.cc"
+%option noyywrap
+%option nounput
+%option never-interactive
+%x STR
+
+RE_IPV4_BYTE 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?
+RE_IPV4 {RE_IPV4_BYTE}\.{RE_IPV4_BYTE}\.{RE_IPV4_BYTE}\.{RE_IPV4_BYTE}
+RE_IPV4_PREFIXLEN 3[0-2]|[0-2]?[0-9]
+RE_IPV4NET {RE_IPV4}\/{RE_IPV4_PREFIXLEN}
+
+RE_H4 [a-fA-F0-9]{1,4}
+RE_H4_COLON {RE_H4}:
+RE_LS32 (({RE_H4}:{RE_H4})|{RE_IPV4})
+RE_IPV6_P1      {RE_H4_COLON}{6}{RE_LS32}
+RE_IPV6_P2      ::{RE_H4_COLON}{5}{RE_LS32}
+RE_IPV6_P3      ({RE_H4})?::{RE_H4_COLON}{4}{RE_LS32}
+RE_IPV6_P4      ({RE_H4_COLON}{0,1}{RE_H4})?::{RE_H4_COLON}{3}{RE_LS32}
+RE_IPV6_P5      ({RE_H4_COLON}{0,2}{RE_H4})?::{RE_H4_COLON}{2}{RE_LS32}
+RE_IPV6_P6      ({RE_H4_COLON}{0,3}{RE_H4})?::{RE_H4_COLON}{1}{RE_LS32}
+RE_IPV6_P7      ({RE_H4_COLON}{0,4}{RE_H4})?::{RE_LS32}
+RE_IPV6_P8      ({RE_H4_COLON}{0,5}{RE_H4})?::{RE_H4}
+RE_IPV6_P9      ({RE_H4_COLON}{0,6}{RE_H4})?::
+RE_IPV6 	{RE_IPV6_P1}|{RE_IPV6_P2}|{RE_IPV6_P3}|{RE_IPV6_P4}|{RE_IPV6_P5}|{RE_IPV6_P6}|{RE_IPV6_P7}|{RE_IPV6_P8}|{RE_IPV6_P9}
+RE_IPV6_PREFIXLEN 12[0-8]|1[01][0-9]|[0-9][0-9]?
+RE_IPV6NET      {RE_IPV6}\/{RE_IPV6_PREFIXLEN}
+
+%%
+
+[[:digit:]]+".."[[:digit:]]+	{ yylval.c_str = strdup(yytext);
+		  return YY_UINTRANGE;
+		}  
+
+[[:digit:]]+	{ yylval.c_str = strdup(yytext);
+		  return YY_UINT;
+		}  
+
+-[[:digit:]]+	{ yylval.c_str = strdup(yytext);
+		  return YY_INT;
+		}  
+
+"true"		{ yylval.c_str = strdup(yytext);
+		  return YY_BOOL;
+		}  
+
+"false"		{ yylval.c_str = strdup(yytext);
+		  return YY_BOOL;
+		}  
+
+\"|\'		BEGIN(STR);
+
+<STR>\"|\'	BEGIN(INITIAL);
+		
+<STR>[^\"\']+	{ yylval.c_str = strdup(yytext); 
+		  _parser_lineno += policy_utils::count_nl(yytext);
+		  /* XXX: a string can be started with " but terminated with '
+		   * and vice versa...
+		   */ 
+		  return YY_STR;
+		}
+
+{RE_IPV4}".."{RE_IPV4}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV4RANGE;
+		}
+
+{RE_IPV4}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV4;
+		}
+
+{RE_IPV4NET}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV4NET;
+		}
+
+		
+{RE_IPV6}".."{RE_IPV6}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV6RANGE;
+		}
+
+{RE_IPV6}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV6;
+		}
+
+{RE_IPV6NET}	{
+		  yylval.c_str = strdup(yytext);
+		  return YY_IPV6NET;
+		}
+
+":"		{
+		  // the colon is an alias for asignment in action and equality
+		  // in the source / dest blocks.
+		  if (_block == Term::ACTION)
+		  	return YY_ASSIGN;
+		  else
+		  	return YY_EQ;
+		}
+
+"("		return YY_LPAR;
+")"		return YY_RPAR;
+"=="		return YY_EQ; 
+"!="		return YY_NE;
+"<="		return YY_LE;
+">="		return YY_GE;
+"<"		return YY_LT;
+">"		return YY_GT;
+"+"		return YY_ADD;
+"*"		return YY_MUL;
+"\-"		return YY_SUB;
+"="		return YY_ASSIGN;
+"+="		return YY_PLUS_EQUALS;
+"-="		return YY_MINUS_EQUALS;
+"||"		return YY_OR;
+"&&"		return YY_AND;
+"!"		return YY_NOT;
+
+"exact"		return YY_IPNET_EQ;
+"longer"	return YY_IPNET_LT;
+"shorter"	return YY_IPNET_GT;
+"orlonger"	return YY_IPNET_LE;
+"orshorter"	return YY_IPNET_GE;
+"and"		return YY_AND;
+"or"		return YY_OR;
+"xor"		return YY_XOR;
+"not"		return YY_NOT;
+"add"		return YY_PLUS_EQUALS;
+"sub"		return YY_MINUS_EQUALS;
+"head"		return YY_HEAD;
+"ctr"		return YY_CTR;
+"ne_int"	return YY_NE_INT;
+"accept"	return YY_ACCEPT;
+"reject"	return YY_REJECT;
+"SET"		return YY_SET;
+"REGEX"		return YY_REGEX;
+"protocol"	return YY_PROTOCOL;
+"next"		return YY_NEXT;
+"policy"	return YY_POLICY;
+"term"		return YY_TERM;
+
+[[:alpha:]][[:alnum:]_-]*		{ yylval.c_str = strdup(yytext);
+					  return YY_ID;
+					}  
+
+;		return YY_SEMICOLON;
+		  
+[[:blank:]]+	/* eat blanks */
+
+"\n"		_parser_lineno++;
+
+.		{ yyerror("Unknown character"); }
+
+%%
+
+void yyerror(const char *m)
+{
+        ostringstream oss;
+        oss << "Error on line " <<  _parser_lineno << " near (";
+
+	for(int i = 0; i < yyleng; i++)
+		oss << yytext[i];
+	oss << "): " << m;
+
+        _last_error = oss.str();
+}
+
+// Everything is put in the lexer because of YY_BUFFER_STATE...
+int 
+policy_parser::policy_parse(vector<Node*>& outnodes, const Term::BLOCKS& block, 
+			    const string& conf, string& outerr)
+{
+
+        YY_BUFFER_STATE yybuffstate = yy_scan_string(conf.c_str());
+
+        _last_error = "No error";
+        _parser_nodes = &outnodes;
+        _parser_lineno = 1;
+	_block = block;
+
+        int res = yyparse();
+        
+        yy_delete_buffer(yybuffstate);
+        outerr = _last_error;
+        
+        return res;
+}
-- 
1.7.9.5



More information about the Xorp-hackers mailing list