Skip to content

Commit 369bcf4

Browse files
committed
Arreglado un problema con el Look-Ahead del parser.
Parsea asignaciones. Lexea MQ como Mientras_Que
1 parent 076f23a commit 369bcf4

File tree

4 files changed

+109
-71
lines changed

4 files changed

+109
-71
lines changed

src/correctorcodigodoc/Lexer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* @author Sebastian
1010
*/
1111
public class Lexer {
12-
private char[] codigo;
12+
private final char[] codigo;
1313
private char ultimo_caracter;
1414
private Token ultimo_token;
1515
private int lex_index;
@@ -44,8 +44,12 @@ public class Lexer {
4444

4545
TiposToken.put("inicio", Token.Ids.INICIO);
4646
TiposToken.put("fin", Token.Ids.FIN);
47+
4748
TiposToken.put("mientras_que", Token.Ids.MIENTRAS_QUE);
49+
TiposToken.put("mq", Token.Ids.MIENTRAS_QUE);
4850
TiposToken.put("fin_mientras_que", Token.Ids.FIN_MIENTRAS_QUE);
51+
TiposToken.put("fin_mq", Token.Ids.FIN_MIENTRAS_QUE);
52+
4953
TiposToken.put("haga", Token.Ids.HAGA);
5054
TiposToken.put("si", Token.Ids.SI);
5155
TiposToken.put("entonces", Token.Ids.ENTONCES);

src/correctorcodigodoc/Parser.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public ParserStatement parseStatement() throws ParseException {
3535
if (current_token == null)
3636
return null;
3737

38-
Token next_token = lexer.nextToken();
38+
Token next_token = lexer.peekToken();
39+
boolean advance = true;
3940
ParserStatement statement = null;
4041

4142
switch (current_token.id) {
@@ -49,42 +50,57 @@ public ParserStatement parseStatement() throws ParseException {
4950

5051
case TIPO_DATO: {
5152
// El siguiente token debe ser un identificador o una lista
52-
List<Identifier> tokens = parseIdentifierList(next_token);
53+
List<Identifier> tokens = parseIdentifierList(lexer.nextToken());
5354
if (tokens.isEmpty()) {
5455
throw new ParseException("Error de sintaxis en la lista de identificadores");
5556
}
5657
statement = new DeclarationStatement(tokens);
5758

5859
// Ya nos comimos el último token, por tanto tenemos que retroceder una posición
5960
next_token = lexer.prevToken();
61+
advance = false;
6062
break;
6163
}
6264

6365
case LEA: {
6466
// El siguiente token debe ser un identificador o una lista
65-
List<Identifier> tokens = parseIdentifierList(next_token);
67+
List<Identifier> tokens = parseIdentifierList(lexer.nextToken());
6668
if (tokens.isEmpty()) {
6769
throw new ParseException("Error de sintaxis en la lista de identificadores");
6870
}
6971
statement = new ReadInputStatement(tokens);
7072

7173
// Ya nos comimos el último token, por tanto tenemos que retroceder una posición
7274
next_token = lexer.prevToken();
75+
advance = false;
7376
break;
7477
}
7578

7679
case PARA: {
77-
statement = parseForStatement(next_token);
78-
next_token = lexer.nextToken();
80+
statement = parseForStatement(lexer.nextToken());
7981
break;
8082
}
8183
case FIN_PARA: {
8284
statement = new EndForStatement();
8385
break;
8486
}
87+
88+
case IDENTIFIER: {
89+
// Un identificador libre indica una asignación
90+
Identifier variable = parseIdentifier(current_token);
91+
Token asign = lexer.nextToken(); // Comete el signo de asignacion
92+
if (asign.id != Token.Ids.ASIGNACION)
93+
throw new ParseException("Variable inesperada");
94+
Expression value = parseExpression(lexer.nextToken(), Token.Ids.NUEVA_LINEA);
95+
statement = new AssignmentStatement(variable, value);
96+
break;
97+
}
8598
}
8699

87-
current_token = next_token;
100+
if (advance)
101+
current_token = lexer.nextToken();
102+
else
103+
current_token = next_token;
88104
return statement;
89105
}
90106

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package parser;
7+
8+
import compiladorpseu.Tokens.Token;
9+
import java.util.List;
10+
11+
/**
12+
*
13+
* @author Sebastian
14+
*/
15+
public class AssignmentStatement extends ParserStatement {
16+
private Identifier variable;
17+
private Expression value;
18+
19+
public AssignmentStatement(Identifier variable, Expression value) {
20+
this.variable = variable;
21+
this.value = value;
22+
}
23+
}

test/tests/ParserTest.java

Lines changed: 59 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -44,72 +44,67 @@ public void tearDown() {
4444
}
4545

4646
@Test
47-
public void TestDeclaracion() {
47+
public void TestDeclaracion() throws ParseException {
4848
Lexer lexer = new Lexer("ENTERO j \n ENTERO i \n ENTERO j, w \n ENTERO B(100, 99) \n ENTERO L(B(1,2), 3)");
4949
Parser parser = new Parser(lexer);
50-
try {
51-
ParserStatement statement = parser.parseStatement();
52-
assertEquals(true, statement instanceof DeclarationStatement);
53-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
54-
assertEquals("j", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
55-
56-
statement = parser.parseStatement();
57-
assertEquals(true, statement instanceof NullStatement);
58-
59-
statement = parser.parseStatement();
60-
assertEquals(true, statement instanceof DeclarationStatement);
61-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
62-
assertEquals("i", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
63-
64-
statement = parser.parseStatement();
65-
assertEquals(true, statement instanceof NullStatement);
66-
67-
statement = parser.parseStatement();
68-
assertEquals(true, statement instanceof DeclarationStatement);
69-
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().size());
70-
assertEquals("j", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
71-
assertEquals("w", ((DeclarationStatement)statement).getIdentifiers().get(1).getNombre());
72-
73-
statement = parser.parseStatement();
74-
assertEquals(true, statement instanceof NullStatement);
75-
76-
statement = parser.parseStatement();
77-
assertEquals(true, statement instanceof DeclarationStatement);
78-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
79-
assertEquals("B", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
80-
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().size());
81-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().size());
82-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().size());
83-
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).isConstant());
84-
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).isConstant());
85-
assertEquals("100", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).getNombre());
86-
assertEquals("99", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).getNombre());
87-
88-
statement = parser.parseStatement();
89-
assertEquals(true, statement instanceof NullStatement);
90-
91-
statement = parser.parseStatement();
92-
assertEquals(true, statement instanceof DeclarationStatement);
93-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
94-
assertEquals("L", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
95-
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().size());
96-
97-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().size());
98-
assertEquals(false, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).isConstant());
99-
assertEquals("B", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).getNombre());
100-
Identifier B = (Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0);
101-
assertEquals(2, B.getParameters().size());
102-
assertEquals(1, B.getParameters().get(0).getTokens().size());
103-
assertEquals("1", ((Identifier)B.getParameters().get(0).getTokens().get(0)).getNombre());
104-
assertEquals(1, B.getParameters().get(1).getTokens().size());
105-
assertEquals("2", ((Identifier)B.getParameters().get(1).getTokens().get(0)).getNombre());
50+
ParserStatement statement = parser.parseStatement();
51+
assertEquals(true, statement instanceof DeclarationStatement);
52+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
53+
assertEquals("j", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
10654

107-
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().size());
108-
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).isConstant());
109-
assertEquals("3", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).getNombre());
110-
111-
} catch (ParseException ex) {
112-
assertEquals(false, true);
113-
}
55+
statement = parser.parseStatement();
56+
assertEquals(true, statement instanceof NullStatement);
57+
58+
statement = parser.parseStatement();
59+
assertEquals(true, statement instanceof DeclarationStatement);
60+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
61+
assertEquals("i", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
62+
63+
statement = parser.parseStatement();
64+
assertEquals(true, statement instanceof NullStatement);
65+
66+
statement = parser.parseStatement();
67+
assertEquals(true, statement instanceof DeclarationStatement);
68+
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().size());
69+
assertEquals("j", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
70+
assertEquals("w", ((DeclarationStatement)statement).getIdentifiers().get(1).getNombre());
71+
72+
statement = parser.parseStatement();
73+
assertEquals(true, statement instanceof NullStatement);
74+
75+
statement = parser.parseStatement();
76+
assertEquals(true, statement instanceof DeclarationStatement);
77+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
78+
assertEquals("B", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
79+
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().size());
80+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().size());
81+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().size());
82+
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).isConstant());
83+
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).isConstant());
84+
assertEquals("100", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).getNombre());
85+
assertEquals("99", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).getNombre());
86+
87+
statement = parser.parseStatement();
88+
assertEquals(true, statement instanceof NullStatement);
89+
90+
statement = parser.parseStatement();
91+
assertEquals(true, statement instanceof DeclarationStatement);
92+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().size());
93+
assertEquals("L", ((DeclarationStatement)statement).getIdentifiers().get(0).getNombre());
94+
assertEquals(2, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().size());
95+
96+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().size());
97+
assertEquals(false, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).isConstant());
98+
assertEquals("B", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0)).getNombre());
99+
Identifier B = (Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(0).getTokens().get(0);
100+
assertEquals(2, B.getParameters().size());
101+
assertEquals(1, B.getParameters().get(0).getTokens().size());
102+
assertEquals("1", ((Identifier)B.getParameters().get(0).getTokens().get(0)).getNombre());
103+
assertEquals(1, B.getParameters().get(1).getTokens().size());
104+
assertEquals("2", ((Identifier)B.getParameters().get(1).getTokens().get(0)).getNombre());
105+
106+
assertEquals(1, ((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().size());
107+
assertEquals(true, ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).isConstant());
108+
assertEquals("3", ((Identifier)((DeclarationStatement)statement).getIdentifiers().get(0).getParameters().get(1).getTokens().get(0)).getNombre());
114109
}
115110
}

0 commit comments

Comments
 (0)