[apparmor] [PATCH 06/13] Enable the parser to pass the next token to be returned to the lexer
Kees Cook
kees at ubuntu.com
Tue Feb 14 19:14:11 UTC 2012
Hi John,
On Tue, Feb 14, 2012 at 09:32:28AM -0800, John Johansen wrote:
> 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
Needless whitespace addition in this chunk. Otherwise, looks fine to me.
-Kees
--
Kees Cook
More information about the AppArmor
mailing list