[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