Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
soc:2009:lynusvaz:notes:start [2009/06/01 21:45] lynusvaz |
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/ | 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. | ||