[apparmor] [PATCH 06/13] Enable the parser to pass the next token to be returned to the lexer

John Johansen john.johansen at canonical.com
Tue Feb 14 17:32:28 UTC 2012


Currently the parser can not directly influence the lexer output.  This
limits the grammar and also how the parser can be invoked.  Allow the
parser to pass the next TOKEN that the lexer will return.

This is has two uses:  It allows us to trick the bison parser into having
multiple start symbols, allowing us to say invoke the parser on an
individual network or file rule.  It also allows the semantic analysis of
the parser to change the language recognized.  This can be leveraged to
overcome some of the limitation of bison's LALR parse generator.

Signed-off-by: John Johansen <john.johansen at canonical.com>
---
 parser/parser.h      |    5 +++++
 parser/parser_lex.l  |    9 +++++++++
 parser/parser_yacc.y |    3 +++
 3 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/parser/parser.h b/parser/parser.h
index 346620a..7d71fd8 100644
--- a/parser/parser.h
+++ b/parser/parser.h
@@ -25,6 +25,11 @@
 #include "libapparmor_re/apparmor_re.h"
 #include "libapparmor_re/aare_rules.h"
 
+/* Global variable to pass token to lexer.  Will be replaced by parameter
+ * when lexer and parser are made reentrant
+ */
+extern int parser_token;
+
 typedef enum pattern_t pattern_t;
 
 struct flagval {
diff --git a/parser/parser_lex.l b/parser/parser_lex.l
index e4f8f66..87ede55 100644
--- a/parser/parser_lex.l
+++ b/parser/parser_lex.l
@@ -222,6 +222,15 @@ LT_EQUAL	<=
 
 %%
 
+%{
+/* Copied directly into yylex function */
+	if (parser_token) {
+		int t = parser_token;
+		parser_token = 0;
+		return t;
+	}
+%}
+
 <INCLUDE>{
 	{WS}+	{ /* Eat whitespace */ }
 	\<([^\> \t\n]+)\>	{	/* <filename> */
diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y
index af56a20..2a4fa5d 100644
--- a/parser/parser_yacc.y
+++ b/parser/parser_yacc.y
@@ -69,6 +69,8 @@ struct value_list {
 	struct value_list *next;
 };
 
+int parser_token = 0;
+
 void free_value_list(struct value_list *list);
 struct cod_entry *do_file_rule(char *namespace, char *id, int mode,
 			       char *link_id, char *nt);
@@ -77,6 +79,7 @@ void add_local_entry(struct codomain *cod);
 
 %}
 
+
 %token TOK_ID
 %token TOK_CONDID
 %token TOK_CARET
-- 
1.7.9




More information about the AppArmor mailing list