-
-
Save borkdude/98c5d9e2bf598b227e8e643e4271e61e to your computer and use it in GitHub Desktop.
bash.ebnf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<number> ::= #"[0-9]"+ | |
<word> ::= #"[a-zA-z]"+ | |
<word_list> ::= <word> | |
| <word_list> <word> | |
<assignment_word> ::= <word> '=' <word> | |
<redirection> ::= '>' <word> | |
| '<' <word> | |
| <number> '>' <word> | |
| <number> '<' <word> | |
| '>>' <word> | |
| <number> '>>' <word> | |
| '<<' <word> | |
| <number> '<<' <word> | |
| '<&' <number> | |
| <number> '<&' <number> | |
| '>&' <number> | |
| <number> '>&' <number> | |
| '<&' <word> | |
| <number> '<&' <word> | |
| '>&' <word> | |
| <number> '>&' <word> | |
| '<<-' <word> | |
| <number> '<<-' <word> | |
| '>&' '-' | |
| <number> '>&' '-' | |
| '<&' '-' | |
| <number> '<&' '-' | |
| '&>' <word> | |
| <number> '<>' <word> | |
| '<>' <word> | |
| '>|' <word> | |
| <number> '>|' <word> | |
<simple_command> ::= (<simple_command_element>)* | |
<simple_command_element> ::= <word> | |
| <assignment_word> | |
| <redirection> | |
<redirection_list> ::= <redirection> | |
| <redirection_list> <redirection> | |
<command> ::= <simple_command> | |
| <shell_command> | |
| <shell_command> <redirection_list> | |
<shell_command> ::= <for_command> | |
| <case_command> | |
| 'while' <compound_list> 'do' <compound_list> 'done' | |
| 'until' <compound_list> 'do' <compound_list> 'done' | |
| <select_command> | |
| <if_command> | |
| <subshell> | |
| <group_command> | |
| <function_def> | |
<for_command> ::= 'for' <word> <newline_list> 'do' <compound_list> 'done' | |
| 'for' <word> <newline_list> '{' <compound_list> '}' | |
| 'for' <word> ';' <newline_list> 'do' <compound_list> 'done' | |
| 'for' <word> ';' <newline_list> '{' <compound_list> '}' | |
| 'for' <word> <newline_list> 'in' <word_list> <list_terminator> | |
<newline_list> 'do' <compound_list> 'done' | |
| 'for' <word> <newline_list> 'in' <word_list> <list_terminator> | |
<newline_list> '{' <compound_list> '}' | |
<select_command> ::= 'select' <word> <newline_list> 'do' <list> 'done' | |
| 'select' <word> <newline_list> '{' <list> '}' | |
| 'select' <word> ';' <newline_list> 'do' <list> 'done' | |
| 'select' <word> ';' <newline_list> '{' list '}' | |
| 'select' <word> <newline_list> 'in' <word_list> | |
<list_terminator> <newline_list> 'do' <list> 'done' | |
| 'select' <word> <newline_list> 'in' <word_list> | |
<list_terminator> <newline_list> '{' <list> '}' | |
<case_command> ::= 'case' <word> <newline_list> 'in' <newline_list> 'esac' | |
| 'case' <word> <newline_list> 'in' <case_clause_sequence> | |
<newline_list> 'esac' | |
| 'case' <word> <newline_list> 'in' <case_clause> 'esac' | |
<function_def> ::= <word> '(' ')' <newline_list> <group_command> | |
| 'function' <word> '(' ')' <newline_list> <group_command> | |
| 'function' <word> <newline_list> <group_command> | |
<subshell> ::= '(' <compound_list> ')' | |
<if_command> ::= 'if' <compound_list> 'then' <compound_list> 'fi' | |
| 'if' <compound_list> 'then' <compound_list> 'else' <compound_list> 'fi' | |
| 'if' <compound_list> 'then' <compound_list> <elif_clause> 'fi' | |
<group_command> ::= '{' <list> '}' | |
<elif_clause> ::= 'elif' <compound_list> 'then' <compound_list> | |
| 'elif' <compound_list> 'then' <compound_list> 'else' <compound_list> | |
| 'elif' <compound_list> 'then' <compound_list> <elif_clause> | |
<case_clause> ::= <pattern_list> | |
| <case_clause_sequence> <pattern_list> | |
<pattern_list> ::= <newline_list> <pattern> ')' <compound_list> | |
| <newline_list> <pattern> ')' <newline_list> | |
| <newline_list> '(' <pattern> ')' <compound_list> | |
| <newline_list> '(' <pattern> ')' <newline_list> | |
<case_clause_sequence> ::= <pattern_list> ';;' | |
| <case_clause_sequence> <pattern_list> ';;' | |
<pattern> ::= <word> | |
| <pattern> '|' <word> | |
<list> ::= <newline_list> <list0> | |
<compound_list> ::= <list> | |
| <newline_list> <list1> | |
<list0> ::= <list1> '\n' <newline_list> | |
| <list1> '&' <newline_list> | |
| <list1> ';' <newline_list> | |
<list1> ::= <list1> '&&' <newline_list> <list1> | |
| <list1> '||' <newline_list> <list1> | |
| <list1> '&' <newline_list> <list1> | |
| <list1> ';' <newline_list> <list1> | |
| <list1> '\n' <newline_list> <list1> | |
| <pipeline_command> | |
<list_terminator> ::= '\n' | |
| ';' | |
<newline_list> ::= Epsilon | |
| <newline_list> '\n' | |
<simple_list> ::= <simple_list1> | |
| <simple_list1> '&' | |
| <simple_list1> ';' | |
<simple_list1> ::= <simple_list1> '&&' <newline_list> <simple_list1> | |
| <simple_list1> '||' <newline_list> <simple_list1> | |
| <simple_list1> '&' <simple_list1> | |
| <simple_list1> ';' <simple_list1> | |
| <pipeline_command> | |
<pipeline_command> ::= <pipeline> | |
| '!' <pipeline> | |
| <timespec> <pipeline> | |
| <timespec> '!' <pipeline> | |
| '!' <timespec> <pipeline> | |
<pipeline> ::= | |
<pipeline> '|' <newline_list> <pipeline> | |
| <command> | |
<time_opt> ::= '-p' | |
<timespec> ::= 'time' | |
| 'time' <time_opt> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment