Gramática (semántico)
1 Terminales del Lenguaje
• VAR
• NUM
• FLOAT
• CHAR
• STR
• BREAK: break
• TYPE: int | oat | string | char | bool | void
• ASIG: =
• IF: if
• ELSEIF: else if
• ELSE: else
• WHILE: while
• FOR: for
• TO: to
• NEXT: next
• OP_PR: + | -
• OP_SE: * | /
• OP_LO: AND | OR | NOT
• CONDICIONALES: < | == | <= | >= | > | !=
• INCLUDE: include
• RETURN: return
2 Gramática
Símbolo inicial
START := INCLUDE STR (R1)START | DE (R2)START |
1. if(doesExists([Link])) (R1)
[Link] = INCLUDE + [Link]
else ERROR
1
2. START := DE START (R2)
R2 :=
[Link] = [Link] + [Link]
1. IM := INCLUDE STR (R3)
R3 :=
if(path_exists([Link]))
include([Link]);
else ERROR
Declaración y Denición de Variable y funciones (DE)
DE := TYPE VAR LF
1. DE := TYPE VAR (R4) (R5) LF)
R4 :=
type = [Link]
name = getName(VAR)
setType(name, type)
[Link] = type
[Link] = name
R5 :=
name = getName(VAR)
if([Link]){
setArray(name, [Link])
setSize(name, [Link])
}
else{
setValue(name, [Link])
}
LF := L(R6) | (R7)VF(R8) |
1. LF := L (R6) [Link] = [Link] (R6)
[Link] = [Link]
2. [Link] = [Link] (R7)
3. [Link] = [Link] (R8)
L := [ NUM ]
1. L := [ NUM ] (R7)
R7 :=
[Link] = True
[Link] = [Link]
VF := (R9)AV(R10) | AF |
1. [Link] = [Link] (R9)
2. [Link] = [Link] (R10)
2
AF := ( PARAMETRO ) { CODE }
PARAMETRO := TYPE VAR LV |
LV := , PARAMETRO |
AV := ASIG(R11)MV
if([Link] == [Link]) (R11)
[Link] = [Link]
else ERROR
MV := [ EX PL ] | OP
1. MV := [ EX PL ] (R12)
2. MV := OP R13)
PL := , EX PL|
OP := BO(R14) | DP(R15) | TV(R16)
1. [Link] := [Link] (R14)
2. [Link] := [Link] (R15)
3. [Link] := [Link] (R16)
BO := OP_PR (R17)(R18)BOO
1. if(OP_PR.type == '+') (R17)
[Link] = +
else if(OP_PR.type == '-')
[Link] = -
else ERROR
2. [Link] = [Link] (R18)
BOO := DP(R19) | TV(R20)
1. [Link] = [Link], [Link] = [Link], [Link] = [Link] (R19)
2. [Link] = [Link], [Link] = [Link] (R20)
DP := ( DPP(R29) )
1. [Link] = ([Link]), DP.name_param = ([Link]) (R29)
DPP := BO(R30) | TV(R31)
1. if([Link] == [Link]) (R30)
[Link] = [Link]
3
2. if([Link] == [Link]) (R31)
[Link] = [Link]
TV := PS (R26) TVV
1. [Link] = [Link], [Link] = [Link] (R26)
TVV := BO(R27) | OP_SE (R28)TV | FF(R29) |
1. if([Link] == [Link]) (R27)
[Link] = [Link]
else ERROR
2. if([Link] == [Link]) (R28)
if(OP_SE == '*')
if([Link] == int)
if([Link] == oat)
[Link] * [Link]
else ERROR
if(OP_SE == '/')
if([Link] == int)
if([Link] == oat)
[Link] / [Link]
else ERROR else ERROR else ERROR else ERROR
3. No hay reglas (R29)
EX := NUM(R32) | FLOAT(R33) | CHAR(R34) | STR(R35)
1. [Link] = [Link], [Link] = [Link] (R32)
2. [Link] = [Link], [Link] = [Link] (R33)
3. [Link] = [Link], [Link] = [Link] (R34)
4. [Link] = [Link], [Link] = [Link] (R35)
BODY
BODY := VAR (R36)BODY | IFS (R37)BODY | WH (R38)BODY | FR (R39)BODY | B
(R40)BODY | R(R41) |
1. [Link] = [Link], [Link] = [Link] (R36)
2. [Link] = [Link] (R37)
3. [Link] = [Link] (R38)
4. [Link] = [Link] (R39)
5. [Link] = [Link] (R40)
6. R = [Link] (R41)
R:= RETURN (R42)PS
1. [Link] = [Link] (R42)
B := BREAK(R43)
4
1. if(isWhile()) (R43)
BREAK = TRUE
else FALSE
VAR := TYPE VAR AS | VAR LAV
LAV := L AV | AV | FF
FF := ( PS MPS )
MPS := , PS MPS |
AS := AV |
IFS := IF EI EL
IF := IF ( CON ) { CODE }
EI := ELSEIF ( CON ) { CODE } EI |
EL := ELSE { CODE } |
CON := ( PS ZZ ) MO
MO := OP_LO CON|
PS := VAR(R21) | NUM(R22) | FLOAT(R23) | CHAR(R24) | STR(R25)
1. [Link] = getType(VAR), if(doesExists(VAR)){ [Link] = [Link]} (R21)
2. [Link] = [Link], [Link] = [Link] (R22)
3. [Link] = getType([Link]), [Link] = [Link] (R23)
4. [Link] = getType([Link]), [Link] = [Link] (R24)
5. [Link] = getType([Link]), [Link] = [Link] (R25)
WH := WHILE ( CON ) { CODE }
FR := FOR ( FV ) TO ( VL ) NEXT ( VL ) { CODE }
FV := VAR AV | FA
FA := TYPE VAR ASIG VL
VL := NUM | FLOAT
ZZ := CONDICIONALES PS |