Skip to content

Daniel Eduardo Bautista Fuentes 2121323

Gramáticas independientes del contexto

WHILE

Go

EJEMPLOS DE POSIBLES FOR

No existe una sintaxis while ()... para go, únicamente loops for, así que la sintaxis de esta, esta en la sección del for.

PROPUESTA DE GRAMÁTICA

No existe una sintaxis while ()... para go, únicamente loops for, así que la sintaxis de esta, esta en la sección del for.

Java

while (myId) {
    // ...
}

while (i < 10) {

}

int j = 0;
do {

} while(j < 5);

PROPUESTA DE GRAMÁTICA

e         : epsilon


while_stmt         -> "while" "(" while_bool ")" "{" statements "}"
                    | "do" "{" statements "}" "while" "(" while_bool ")"
while_bool         -> vals
                    | vals cmp_sgn vals
vals               -> id
                    | "true"
                    | "false"
                    | <number> // cualquier digito posible
cmp_sgn            -> "<"
                    | "<="
                    | ">"
                    | ">="
                    | "=="
statements         -> statements statement
                    | statement

statement          -> // cualquier sentencia de un bloque de codigo
                      // incluido el mismo while_stmt
                    | e

Python

while True:
    # code


while my_condition:
    # code


while i < 21:
    # code

else:
    # code

PROPUESTA DE GRAMÁTICA

e         : epsilon
JL        : salto de linea

while_stmt         -> "while" while_bool ":" JL statements JL
                    | "while" while_bool ":" JL 
                        statements JL "else" ":" JL statements JL
while_bool         -> vals
                    | vals cmp_sgn vals
vals               -> id
                    | "True"
                    | "False"
                    | <number> // cualquier digito posible
cmp_sgn            -> "<"
                    | "<="
                    | ">"
                    | ">="
                    | "=="
statements         -> statements statement
                    | statement

statement          -> // cualquier sentencia de un bloque de codigo
                      // incluido el mismo while_stmt
                    | e

FOR

Go

EJEMPLOS DE POSIBLES FOR

// EJEMPLO FOR EN GO
for i < 5 {
    // ...
}

for {
    // ...
}

for i, v := range items {
    // ...
}

for k, v := range m {
    // ...
}

for i := 0; i < 2; i++ {
    // ...
}

PROPUESTA DE GRAMÁTICA

I  : initialization
C  : condition
P  : postcondition
CB : code block 
W  : while
e  : epsilon

nota: CB puede generar cualquier otra sentencia, incluso un mismo for, pero para mantener el ejercicio pequeño, supondré que CB produce 2 unicas cosas.

W           -> "for" for_expr "{" statements "}"
for_expr    -> for_condit
             | for_iterator
             | for_range
for_cond    -> expression
for_iter    -> id
             | id assign_oper expression
             | id assign_oper expression "," id assign_oper expression
for_range   -> id "," id ":=" "range" expression
statements  -> statement
             | statements statement
statement   -> id
             | literal
             | e
expression  -> simple_expr
             | expression operator statement
operator    -> "+" 
             | "-"
             | "*"
             | "/"
             | "<"
             | ">"
             | "<="
             | ">="
             | "=="
             | ":="
literal     -> number
             | string
             | boolean
number      ->  // cualquier numero, algun regex para numeros
NOTA: statement puede ser cualquier sentencia de codigo, if, while... el mismo for

Java

EJEMPLOS DE POSIBLES FOR

// EJEMPLOS
for (int i = 0; i < 5; i++) {
    // ...
}

String[] data = []{"hola", "pato", "adios"};
for (String a : myArray) {
    // ...
}

PROPUESTA DE GRAMÁTICA

id    : identifier
digit : cualquier tipo de numero
e     : epsilon

for              -> "for" "(" conditional ")" "{" statements "}"
conditional      ->   typeO id "=" <digit> ";" id cmp_sgn <digit> ";" id icdc_sgn
                    | typeO id ":" "id"
typeO            ->   "int"
                    | "float"
                    | "double"
cmp_sgn          ->   "<"
                    | "<="
                    | ">"
                    | ">="
                    | "=="
icdc_sgn         ->   "--"
                    | "++"
statements       ->   statement
                    | statements statement
statement        ->   if_statement
                    | while_statement
                    | ... cualquier otra sentencia de codigo
                    | for   <- statement haria recursiva la gramatica
                    | e

Python

EJEMPLOS DE POSIBLES FOR


for my_var in my_secuence:
    # block code

for _key, _value in dictionary.items():
    # block code

for i in range(_start, _end, _steps):
    # block code

for i in range(_start, _end):
    # block code

PROPUESTA DE GRAMÁTICA

JL        : salto de linea

for_stmt       -> "for" iter_val "in" vct_trough ":" JL statements JL
iter_val       -> id
                | id "," id
vct_trough     -> id
                | "range" "(" rng_cmp ")"
rng_cmp        -> itm_val
                | itm_val "," itm_val
                | itm_val "," itm_val "," itm_val
itm_val        -> numero
                | id
statements     -> statements statement
                | statement
statement      -> ... cualquier sentencia incluido el mismo for

IF

Go

if condition

{

 // statements...

}

PROPUESTA DE GRAMÁTICA

id    : identifier
digit : cualquier tipo de número
e     : epsilon


if           -> if condition "{" statements "}"
condition    -> exp cmp_operator exp
cmp_operator ->   "=="
                | "!="
                | ">"
                | "<"
                | ">="
                | "<="
exp          ->   id
                | digit
statements   ->   if_tatement
                | while_statement
                | ... cualquier otra sentencia de código
                | e

Java


if (condition) {
    // statements...
}

PROPUESTA DE GRAMÁTICA

id    : identifier
digit : cualquier tipo de número
e     : epsilon

if           -> if "(" condition ")" "{" statements "}"
condition    -> exp cmp_operator exp
cmp_operator ->   "=="
                | "!="
                | ">"
                | "<"
                | ">="
                | "<="
exp          ->   id
                | digit
statements   ->   if_tatement
                | while_statement
                | ... cualquier otra sentencia de código
                | e

Python

if condition:

    # statements...

PROPUESTA DE GRAMÁTICA


id    : identifier
digit : cualquier tipo de número
e     : epsilon

if           -> if condition: statements
condition    -> exp cmp_operator exp
cmp_operator ->   "=="
                | "!="
                | ">"
                | "<"
                | ">="
                | "<="
exp          ->   id
                | digit
statements   ->   if_tatement
                | while_statement
                | ... cualquier otra sentencia de código
                | e