prev - index

Appendix A

Pseudo BNF Syntax of Ruby

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']


prev - index

matz@caelum.co.jp