added elif patch from Deepak Vankadaru

This commit is contained in:
BVK Chaitanya 2010-03-21 10:27:21 +05:30
parent 8c85123cd5
commit 0f3a3e3ece
3 changed files with 57 additions and 12 deletions

View file

@ -53,6 +53,9 @@ grub_script_vars1_SOURCES = tests/grub_script_vars1.in
check_SCRIPTS += grub_script_for1 check_SCRIPTS += grub_script_for1
grub_script_for1_SOURCES = tests/grub_script_for1.in grub_script_for1_SOURCES = tests/grub_script_for1.in
check_SCRIPTS += grub_script_if
grub_script_if_SOURCES = tests/grub_script_if.in
# List of tests to execute on "make check" # List of tests to execute on "make check"
# SCRIPTED_TESTS = example_scripted_test # SCRIPTED_TESTS = example_scripted_test
# SCRIPTED_TESTS += example_grub_script_test # SCRIPTED_TESTS += example_grub_script_test
@ -63,6 +66,7 @@ SCRIPTED_TESTS = grub_script_echo1
SCRIPTED_TESTS += grub_script_echo_keywords SCRIPTED_TESTS += grub_script_echo_keywords
SCRIPTED_TESTS += grub_script_vars1 SCRIPTED_TESTS += grub_script_vars1
SCRIPTED_TESTS += grub_script_for1 SCRIPTED_TESTS += grub_script_for1
SCRIPTED_TESTS += grub_script_if
# dependencies between tests and testing-tools # dependencies between tests and testing-tools
$(SCRIPTED_TESTS): grub-shell grub-shell-tester $(SCRIPTED_TESTS): grub-shell grub-shell-tester

View file

@ -74,7 +74,7 @@
%token <arg> GRUB_PARSER_TOKEN_WORD "word" %token <arg> GRUB_PARSER_TOKEN_WORD "word"
%type <arglist> word argument arguments0 arguments1 %type <arglist> word argument arguments0 arguments1
%type <cmd> script_init script grubcmd ifcmd forcmd command %type <cmd> script_init script grubcmd ifclause ifcmd forcmd command
%type <cmd> commands1 menuentry statement %type <cmd> commands1 menuentry statement
%pure-parser %pure-parser
@ -224,17 +224,27 @@ menuentry: "menuentry"
} }
; ;
if: "if" { grub_script_lexer_ref (state->lexerstate); } ifcmd: "if"
;
ifcmd: if commands1 delimiters1 "then" commands1 delimiters1 "fi"
{ {
$$ = grub_script_create_cmdif (state, $2, $5, 0); grub_script_lexer_ref (state->lexerstate);
}
ifclause "fi"
{
$$ = $3;
grub_script_lexer_deref (state->lexerstate); grub_script_lexer_deref (state->lexerstate);
} }
| if commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1 "fi" ;
ifclause: commands1 delimiters1 "then" commands1 delimiters1
{ {
$$ = grub_script_create_cmdif (state, $2, $5, $8); $$ = grub_script_create_cmdif (state, $1, $4, 0);
grub_script_lexer_deref (state->lexerstate); }
| 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);
} }
; ;

31
tests/grub_script_if.in Normal file
View file

@ -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