Ruby

  • Categorias

  • Arquivos

BNF

PROGRAM : COMPSTMT

T : “;” | “\n” //a newline can terminate a statement

COMPSTMT : STMT {T EXPR} [T]

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 “}” //object initializer

| “END” “{” COMPSTMT “}” //object finalizer

| 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

{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 : T | then | T then //”then” and “do” can go on next line

DO : T | do | T 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 T

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

The following are recognized by the lexical analyzer.

OP_ASGN : += | -= | *= | /= | %= | **=

| &= | |= | ˆ= | <<= | >>=

| &&= | ||=

SYMBOL : :FNAME | :VARNAME

FNAME : IDENTIFIER | .. | “|” | ˆ | & | <=> | == | === | =˜

| > | >= | < | <= | + | – | * | / | % | **

| << | >> | ˜ | +@ | -@ | [] | []=

OPERATION : 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 : sequence in /[a-zA-Z_]{a-zA-Z0-9_}/.


COMENTÁRIOS:

STRING : ” {any_char} ”
| ´ {any_char} ´
| ` {any_char} `

Uma STRING é definida como 0,1 ou vários caracteres, delimitados por ”
” ou ´ ´ ou ` `.

VARIABLE : VARNAME
| nil
| self

Uma variável é definida por um nome, VARNAME (abstração que consistena definição de um nome válido para variáveis); ou nil(palavra reservada que representa o valor de uma variável não inicializada); ou self (é uma variável especial que recebe um método, quando este nãotem uma variável específica que o chame).

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

Dessa parte, concluimos que todo programa é composto de um “complete statemente”, por sua vez um complete statemente é composto de um ou vários “statements” e os statements devem começar e terminar com variáveis de bloco, no caso de ruby palavras reservadas como ” def”, “begin”, “do” e outras para iniciar e “end” para terminar o bloco.

Deixe um comentário