diff --git a/ChangeLog b/ChangeLog index 070461b5e..1e23de038 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-04-09 BVK Chaitanya + + Elif support to GRUB script (by Deepak Vankadaru). + + * tests/grub_script_if.in: New testcase. + * conf/tests.rmk: Rule for new testcase. + * script/parser.y: Grammar rules for elif. + 2010-04-09 BVK Chaitanya While and until loops support to GRUB script. diff --git a/conf/tests.rmk b/conf/tests.rmk index 5f78ea940..11e5f2a1a 100644 --- a/conf/tests.rmk +++ b/conf/tests.rmk @@ -56,6 +56,9 @@ grub_script_for1_SOURCES = tests/grub_script_for1.in check_SCRIPTS += grub_script_while1 grub_script_while1_SOURCES = tests/grub_script_while1.in +check_SCRIPTS += grub_script_if +grub_script_if_SOURCES = tests/grub_script_if.in + check_SCRIPTS += grub_script_blanklines grub_script_blanklines_SOURCES = tests/grub_script_blanklines.in @@ -73,9 +76,11 @@ SCRIPTED_TESTS += grub_script_echo_keywords SCRIPTED_TESTS += grub_script_vars1 SCRIPTED_TESTS += grub_script_for1 SCRIPTED_TESTS += grub_script_while1 +SCRIPTED_TESTS += grub_script_if SCRIPTED_TESTS += grub_script_blanklines SCRIPTED_TESTS += grub_script_final_semicolon + # dependencies between tests and testing-tools $(SCRIPTED_TESTS): grub-shell grub-shell-tester $(FUNCTIONAL_TESTS): functional_test.mod diff --git a/script/parser.y b/script/parser.y index a30dd78b3..b5815ea8d 100644 --- a/script/parser.y +++ b/script/parser.y @@ -74,8 +74,9 @@ %token GRUB_PARSER_TOKEN_WORD "word" %type word argument arguments0 arguments1 + %type script_init script -%type grubcmd ifcmd forcmd whilecmd untilcmd +%type grubcmd ifclause ifcmd forcmd whilecmd untilcmd %type command commands1 menuentry statement %pure-parser @@ -227,18 +228,28 @@ menuentry: "menuentry" } ; -if: "if" { grub_script_lexer_ref (state->lexerstate); } +ifcmd: "if" + { + grub_script_lexer_ref (state->lexerstate); + } + ifclause "fi" + { + $$ = $3; + grub_script_lexer_deref (state->lexerstate); + } ; -ifcmd: if commands1 delimiters1 "then" commands1 delimiters1 "fi" - { - $$ = grub_script_create_cmdif (state, $2, $5, 0); - grub_script_lexer_deref (state->lexerstate); - } - | if commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1 "fi" - { - $$ = grub_script_create_cmdif (state, $2, $5, $8); - grub_script_lexer_deref (state->lexerstate); - } +ifclause: commands1 delimiters1 "then" commands1 delimiters1 + { + $$ = grub_script_create_cmdif (state, $1, $4, 0); + } + | commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1 + { + $$ = grub_script_create_cmdif (state, $1, $4, $7); + } + | commands1 delimiters1 "then" commands1 delimiters1 "elif" ifclause + { + $$ = grub_script_create_cmdif (state, $1, $4, $7); + } ; forcmd: "for" "name" diff --git a/tests/grub_script_if.in b/tests/grub_script_if.in new file mode 100644 index 000000000..fb17eaf70 --- /dev/null +++ b/tests/grub_script_if.in @@ -0,0 +1,31 @@ +#! @builddir@/grub-shell-tester + +#basic if, execute +if true; then echo yes; fi + +#basic if, no execution +if false; then echo no; fi + +#if else, execute if path +if true; then echo yes; else echo no; fi + +#if else, execute else path +if false; then echo no; else echo yes; fi + +#if elif, execute elif +if false; then echo no; elif true; then echo yes; fi + +#if elif else, execute else +if false; then echo no; elif false; then echo no; else echo yes; fi + +#if elif(1) elif(2), execute elif(2) +if false; then echo no; elif false; then echo no; elif true; then echo yes; fi + +#if elif(1) elif(2) else, execute else +if false; then echo no; elif false; then echo no; elif false; then echo no; else echo yes; fi + +#if {if elif else}, execute elif +if true; then if false; then echo no; elif true; then echo yes; else echo no; fi; fi + +#if {if elif} else, execute elif. ofcourse no dangling-else problem due to "fi" +if true; then if false; then echo no; elif true; then echo yes; fi; else echo no; fi