Here is the syntax of Ruby in pseudo BNF. For more detail, see parse.y in Ruby distribution.
PROGRAM : COMPEXPR
COMPEXPR : EXPR (TERM EXPR)* [TERM]
EXPR : MLHS `=' MRHS
| return CALL_ARGS
| yield CALL_ARGS
| undef FNAME
| alias FNAME FNAME
| EXPR if EXPR
| EXPR while EXPR
| EXPR unless EXPR
| EXPR until EXPR
| EXPR and EXPR
| EXPR or EXPR
| ASSOCS
| ITERATOR do [`|' [ITER_VAR] `|'] COMPEXPR end
| COMMAND
| `!' COMMAND
| ARG
ITERATOR : FUNCTION
| COMMAND
COMMAND : identifier CALL_ARGS
| PRIMARY `.' identifier CALL_ARGS
| super CALL_ARGS
FUNCTION : OPERATION [`(' [CALL_ARGS] `)']
| PRIMARY `.' OPERATION `(' [CALL_ARGS] `)'
| PRIMARY `.' OPERATION
ARG : LHS `=' ARG
| LHS OP_ASGN ARG
| ARG `..' ARG
| ARG `...' ARG
| ARG `+' ARG
| ARG `-' ARG
| ARG `*' ARG
| ARG `/' ARG
| ARG `%' ARG
| ARG `**' ARG
| `+' ARG
| `-' ARG
| ARG `|' ARG
| ARG `^' ARG
| ARG `&' ARG
| ARG `<=>' ARG
| ARG `>' ARG
| ARG `>=' ARG
| ARG `<' ARG
| ARG `<=' ARG
| ARG `==' ARG
| ARG `===' ARG
| ARG `!=' ARG
| ARG `=~' ARG
| ARG `!~' ARG
| `!' ARG
| `~' ARG
| ARG `<<' ARG
| ARG `>>' ARG
| ARG `&&' ARG
| ARG `||' ARG
| defined? ARG
| PRIMARY
PRIMARY : `(' COMPEXPR `)'
| LITERAL
| VARIABLE
| PRIMARY `::' identifier
| super `(' [CALL_ARGS] `)'
| super
| PRIMARY `[' [ARGS] `]'
| `[' [ARGS [`,']] `]'
| `{' [(ARGS|ASSOCS) [`,']] `}'
| return
| yield [`(' [CALL_ARGS] `)']
| defined? `(' EXPR `)'
| FUNCTION
| FUNCTION `{' [`|' [ITER_VAR] `|'] COMPEXPR `}'
| if EXPR THEN
COMPEXPR
(elsif EXPR THEN COMPEXPR)*
[else COMPEXPR]
end
| unless EXPR THEN
COMPEXPR
[else COMPEXPR]
end
| while EXPR TERM COMPEXPR end
| until EXPR TERM COMPEXPR end
| case COMPEXPR
(when ARGS THEN)+
[else COMPEXPR]
end
| for ITER_VAR in EXPR TERM
COMPEXPR
end
| begin
COMPEXPR
[rescue [ARGS] TERM COMPEXPR]+
[ensure COMPEXPR]
end
| class identifier `:' identifier
COMPEXPR
end
| module identifier
COMPEXPR
end
| def FNAME ARGLIST
COMPEXPR
end
| def SINGLETON `.' FNAME ARGLIST
COMPEXPR
end
THEN : TERM
| then
| TERM then
ITER_VAR : LHS
| MLHS
MLHS : LHS `,' [LHS (`,' LHS)*] [`*' LHS]
| `*' LHS
LHS : VARIABLE
| PRIMARY `[' [ARGS] `]'
| PRIMARY `.' identifier
MRHS : ARGS [`,' `*' ARG]
| `*' ARG
CALL_ARGS : ARGS
| ASSOCS
| COMMAND
| ARGS [`,' ASSOCS] [`,' `*' ARG]
| `*' ARG
ARGS : ARG (`,' ARG)*
ARGLIST : `('[identifier(`,'identifier)*][`*'identifier]`)'
| TERM
SINGLETON : VARIABLE
| `(' EXPR `)'
ASSOCS : ASSOC (`,' ASSOC)*
ASSOC : ARG `=>' ARG
VARIABLE : VARNAME
| nil
| self
LITERAL : numeric
| SYMBOL
| STRING
| REGEXP
TERM : `;'
| `\n'
The followings are recognized by lexical analizer.
SYMBOL : `:'FNAME
| `:'VARNAME
FNAME : identifier | `..' | `|' | `^' | `&'
| `<=>' | `==' | `===' | `=~'
| `>' | `>=' | `<' | `<='
| `+' | `-' | `*' | `/' | `%' | `**'
| `<<' | `>>' | `~'
| `+@' | `-@' | `[]' | `[]='
OPERATION : identifier
| identifier'!'
| identifier'?'
VARNAME : GLOBAL
| `@'identifier
| identifier
GLOBAL : `$'identifier
| `$'any_char
STRING : `"' any_char* `"'
| `" any_char* `"
| "' any_char* "'
REGEXP : `/' any_char* `/'[`i'|`o']