From: Igor Maravic <[email protected]>

Signed-off-by: Igor Maravic <[email protected]>
---
 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

_______________________________________________
Xorp-hackers mailing list
[email protected]
http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers

Reply via email to