]> git.ozlabs.org Git - petitboot/commitdiff
discover/grub2: Implement submenu
authorJeremy Kerr <jk@ozlabs.org>
Tue, 17 Sep 2013 03:14:18 +0000 (11:14 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 24 Sep 2013 05:14:59 +0000 (13:14 +0800)
Just recurse into the submenu items, as we flatten everything into the
one menu.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/grub2/lexer.l
discover/grub2/parser.y

index 6c0a456e6503137f2be5c466e2b57d396fc3d33e..6ed12ce8474a14787137c4a1b035342d6aefc29e 100644 (file)
@@ -47,6 +47,7 @@ VARNAME ([[:alpha:]][_[:alnum:]]*|[0-9]|[\?@\*#])
 "in"         return TOKEN_IN;
 "menuentry"  return TOKEN_MENUENTRY;
 "select"     return TOKEN_SELECT;
 "in"         return TOKEN_IN;
 "menuentry"  return TOKEN_MENUENTRY;
 "select"     return TOKEN_SELECT;
+"submenu"    return TOKEN_SUBMENU;
 "then"       return TOKEN_THEN;
 "time"       return TOKEN_TIME;
 "until"      return TOKEN_UTIL;
 "then"       return TOKEN_THEN;
 "time"       return TOKEN_TIME;
 "until"      return TOKEN_UTIL;
index bcf5935d58015c054b7666e8a0595bbd732c786b..859eba30479b93eeac8fa4a8c00d21d7916931d4 100644 (file)
@@ -39,6 +39,7 @@ static void yyerror(struct grub2_parser *, char const *s);
 %token TOKEN_IN                "in"
 %token TOKEN_MENUENTRY         "menuentry"
 %token TOKEN_SELECT            "select"
 %token TOKEN_IN                "in"
 %token TOKEN_MENUENTRY         "menuentry"
 %token TOKEN_SELECT            "select"
+%token TOKEN_SUBMENU           "submenu"
 %token TOKEN_THEN              "then"
 %token TOKEN_TIME              "time"
 %token TOKEN_UTIL              "until"
 %token TOKEN_THEN              "then"
 %token TOKEN_TIME              "time"
 %token TOKEN_UTIL              "until"
@@ -103,6 +104,12 @@ statement: TOKEN_EOL {
                TOKEN_EOL {
                $$ = create_statement_menuentry(parser, $3, $6);
        }
                TOKEN_EOL {
                $$ = create_statement_menuentry(parser, $3, $6);
        }
+       | "submenu" TOKEN_DELIM words TOKEN_DELIM
+               '{' statements '}'
+               TOKEN_EOL {
+               /* we just flatten everything */
+               $$ = create_statement_block(parser, $6);
+       }
 
 words: word {
                $$ = create_argv(parser);
 
 words: word {
                $$ = create_argv(parser);