Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
soc:2009:lynusvaz:notes:start [2009/05/17 07:52] 127.0.0.1 external edit |
soc:2009:lynusvaz:notes:start [2009/08/15 08:40] (current) lynusvaz |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Lynus Vaz: Enhanced scripting language ====== | ====== Lynus Vaz: Enhanced scripting language ====== | ||
| - | |||
| ===== Notes ===== | ===== Notes ===== | ||
| + | [[.:scripting_doc:Features added|Documenting the new features]] | ||
| + | |||
| + | I've taken a few ideas from Fabrice Bellard's C OTCC compiler: http://bellard.org/otcc/ | ||
| + | |||
| + | Also looking at [[http://www.gnu.org/software/bash/bash.html|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. | ||
| + | |||