I've taken a few ideas from Fabrice Bellard's C OTCC compiler: http://bellard.org/otcc/
Also looking at bash
Here's the POSIX specification for the shell: http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
And the PXE specification: http://www.pix.net/software/pxeboot/archive/pxespec.pdf
Proposed syntax:
LINES => LINE '\n' LINES | e
LINE => WORD | WORD WS ARG_LIST | e
ARG_LIST => ARG WS ARG_LIST | e
ARG => WORD
SP => ' ' | '\t'
WS => SP | SP WS
NOT_EXP => (any - { SP, '$(', ')', '${', '}') /* Represents characters not expanded */
WORD => NOT_EXP WORD | EXP WORD | NOT_EXP | EXP
EXP => EXPR_EXP | VAR_EXP /* Expansions */
EXPR_EXP => '$(' EXPR ')'
VAR_EXP => '${' (any - { '}' })+ '}'
EXPR => TERM | TERM BIN_OP EXPR | MONO_OP EXPR
TERM => VAR_EXP | STRING
NUM => ('+' | '-' )? ( '(' EXPR ')' | (digit)+ )
STRING => (any - { '$(', ')', '${', '}', ' ', BIN_OP, MONO_OP})+ /* This will help with string comparison */
BIN_OP => '*' | '/' | '%' /* Convert both operands to integers */
| '+' | '-'
| '<<' | '>>'
| '<' | '<=' | '>' | '>='
| '!=' | '==' /* Should also work for strings */
| '&'
| '|'
| '^'
| '&&'
| '||'
MONO_OP => '~' | '!'
Syntax for if-else branches:
if <condition>
<statements>
[ else
<statements> ]
fi
Proposed syntax for while loops:
while <condition>
do
<statements>
done
Proposed syntax for for loops:
for <variable> in <value list>
do
<statements>
done
Pretty similar to the shell syntax, so it should be familiar.