Pseudo BNF Syntax of Ruby
Here is the syntax of Ruby in pseudo BNF. For more detail, see parse.y in Ruby distribution.
PROGRAM : COMPSTMT
COMPSTMT : STMT (TERM EXPR)* [TERM]
STMT : CALL do [|' [BLOCK_VAR]|'] COMPSTMT end
| undef FNAME
| alias FNAME FNAME
| STMT if EXPR
| STMT while EXPR
| STMT unless EXPR
| STMT until EXPR
| BEGIN'{' COMPSTMT }'
|END' {' COMPSTMT}'
| LHS =' COMMAND [do [|' [BLOCK_VAR] `|'] COMPSTMT end]
| EXPR
EXPR : MLHS =' MRHS
| return CALL_ARGS
| yield CALL_ARGS
| EXPR and EXPR
| EXPR or EXPR
| not EXPR
| COMMAND
|!' COMMAND
| ARG
CALL : FUNCTION | COMMAND
COMMAND : OPERATION CALL_ARGS
| PRIMARY .' OPERATION CALL_ARGS
| PRIMARY::' OPERATION CALL_ARGS
| super CALL_ARGS
FUNCTION : OPERATION [(' [CALL_ARGS])']
| PRIMARY .' OPERATION(' [CALL_ARGS] )'
| PRIMARY::' OPERATION (' [CALL_ARGS])'
| PRIMARY .' OPERATION
| PRIMARY::' OPERATION
| super (' [CALL_ARGS])'
| super
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 : (' COMPSTMT)'
| LITERAL
| VARIABLE
| PRIMARY ::' IDENTIFIER
|::' IDENTIFIER
| PRIMARY [' [ARGS]]'
| [' [ARGS [,']] ]'
|{' [(ARGS|ASSOCS) [,']]}'
| return [(' [CALL_ARGS])']
| yield [(' [CALL_ARGS])']
| defined? (' ARG)'
| FUNCTION
| FUNCTION {' [|' [BLOCK_VAR] |'] COMPSTMT}'
| if EXPR THEN
COMPSTMT
(elsif EXPR THEN COMPSTMT)*
[else COMPSTMT]
end
| unless EXPR THEN
COMPSTMT
[else COMPSTMT]
end
| while EXPR DO COMPSTMT end
| until EXPR DO COMPSTMT end
| case COMPSTMT
(when WHEN_ARGS THEN COMPSTMT)+
[else COMPSTMT]
end
| for BLOCK_VAR in EXPR DO
COMPSTMT
end
| begin
COMPSTMT
[rescue [ARGS] DO COMPSTMT]+
[else COMPSTMT]
[ensure COMPSTMT]
end
| class IDENTIFIER [<' IDENTIFIER]
COMPSTMT
end
| module IDENTIFIER
COMPSTMT
end
| def FNAME ARGDECL
COMPSTMT
end
| def SINGLETON (.'|`::') FNAME ARGDECL
COMPSTMT
end
WHEN_ARGS : ARGS [,'' ARG]
| `' ARG
THEN : TERM | then | TERM then
DO : TERM | do | TERM do
BLOCK_VAR : LHS | MLHS
MLHS : MLHS_ITEM ,' [MLHS_ITEM (,' MLHS_ITEM)] [`' [LHS]]
| `*' LHS
MLHS_ITEM : LHS | '(' MLHS ')'
LHS : VARIABLE
| PRIMARY [' [ARGS]]'
| PRIMARY `.' IDENTIFIER
MRHS : ARGS [,'' ARG]
| `' ARG
CALL_ARGS : ARGS
| ARGS [,' ASSOCS] [,' *' ARG] [,' &' ARG]
| ASSOCS [,' *' ARG] [,' &' ARG]
|*' ARG [,'&' ARG]
| `&' ARG
| COMMAND
ARGS : ARG (`,' ARG)*
ARGDECL : (' ARGLIST)'
| ARGLIST TERM
ARGLIST : IDENTIFIER(,'IDENTIFIER)*[,'*'[IDENTIFIER]][,'&'IDENTIFIER]
|*'IDENTIFIER[,'&'IDENTIFIER]
| [`&'IDENTIFIER]
SINGLETON : VARIABLE
| (' EXPR)'
ASSOCS : ASSOC (`,' ASSOC)*
ASSOC : ARG `=>' ARG
VARIABLE : VARNAME | nil | self
LITERAL : numeric | SYMBOL | STRING | STRING2 | HERE_DOC | REGEXP
TERM : ;'
|\n'
The followings are recognized by lexical analizer.
OP_ASGN : +=' |-=' | *=' |/=' | %=' |**='
| &=' ||=' | ^=' |<<=' | >>='
|&&=' | `||='
SYMBOL : :'FNAME
|:'VARNAME
FNAME : IDENTIFIER | ..' ||' | ^' |&'
| <=>' |==' | ===' |=~'
| >' |>=' | <' |<='
| +' |-' | *' |/' | %' |**'
| <<' |>>' | ~'
|+@' | -@' |[]' | `[]='
OPERATION : IDENTIFIER | IDENTIFIER'!' | IDENTIFIER'?'
VARNAME : GLOBAL | `@'IDENTIFIER | IDENTIFIER
GLOBAL : $'IDENTIFIER
|$'any_char
| `$''-'any_char
STRING : "' any_char*"'
| '' any_char*''
| ' any_char*'
STRING2 : %'(Q'|q'|x')char any_char* char
HERE_DOC : `<<'(IDENTIFIER|STRING) any_char* IDENTIFIER
REGEXP : /' any_char*/'[i'|o'|p']
|%'`r' char any_char* char
IDENTIFIER is the sqeunce of characters in the pattern of /[a-zA-Z_][a-zA-Z0-9_]*/.