Skip to content

Commit

Permalink
[#201] as-z80 & as-8080: fix parsers
Browse files Browse the repository at this point in the history
  • Loading branch information
vbmacher committed Mar 14, 2022
1 parent ea75479 commit 2487d55
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 150 deletions.
6 changes: 3 additions & 3 deletions plugins/compiler/as-8080/src/main/antlr/As8080Lexer.g4
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
lexer grammar As8080Lexer;

COMMENT: ('//' | '--' | ';' | '#' ) ~[\r\n]* -> skip;
COMMENT2: '/*' .*? '*/' -> skip;
COMMENT: ('//' | '--' | ';' | '#' ) ~[\r\n]*;
COMMENT2: '/*' .*? '*/';

fragment A: [aA];
fragment B: [bB];
Expand Down Expand Up @@ -184,5 +184,5 @@ OP_AND_2: '&';
OP_OR_2: '|';
OP_XOR_2: '^';
WS : [ \t\f]+ -> skip;
WS : [ \t\f]+ -> channel(HIDDEN);
EOL: '\r'? '\n';
11 changes: 8 additions & 3 deletions plugins/compiler/as-8080/src/main/antlr/As8080Parser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ options {
}

rStart:
EOL* rLine? (EOL+ rLine)* EOL* EOF
(rLine EOL rLine)* EOF
| rLine EOF
;

rLine:
label=ID_LABEL? EOL* statement=rStatement
| label=ID_LABEL;
label=ID_LABEL? (comment EOL)* statement=rStatement comment
| label=ID_LABEL comment
| comment
;

comment: COMMENT? | COMMENT2?;

rStatement:
instr=rInstruction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,10 @@ public Node visitPseudoIf(PseudoIfContext ctx) {
ifExpr.addChild(expr);
pseudo.addChild(ifExpr);
for (RLineContext line : ctx.rLine()) {
pseudo.addChild(CreateVisitors.line.visitRLine(line));
Node rLine = CreateVisitors.line.visitRLine(line);
if (rLine != null) {
pseudo.addChild(rLine);
}
}
return pseudo;
}
Expand All @@ -60,7 +63,10 @@ public Node visitPseudoMacroDef(PseudoMacroDefContext ctx) {
}
}
for (RLineContext line : ctx.rLine()) {
pseudo.addChild(CreateVisitors.line.visitRLine(line));
Node rLine = CreateVisitors.line.visitRLine(line);
if (rLine != null) {
pseudo.addChild(rLine);
}
}
return pseudo;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,43 +15,46 @@ public void testParseEols() {

@Test
public void testParseError1() {
assertTokenTypes("B !", REG_B, ERROR, EOF);
assertTokenTypes("B !", REG_B, WS, ERROR, EOF);
}

@Test
public void testParseError2() {
assertTokenTypes("0x 9o 22b", ERROR, ERROR, ERROR, EOF);
assertTokenTypes("0x 9o 22b", ERROR, WS, ERROR, WS, ERROR, EOF);
}

@Test
public void testParseHex1() {
assertTokenTypes(
"0x1 0x0 -0x5f -0xFffF 0x1BC",
LIT_HEXNUMBER_1, LIT_HEXNUMBER_1, OP_SUBTRACT, LIT_HEXNUMBER_1, OP_SUBTRACT, LIT_HEXNUMBER_1, LIT_HEXNUMBER_1, EOF
LIT_HEXNUMBER_1, WS, LIT_HEXNUMBER_1, WS, OP_SUBTRACT, LIT_HEXNUMBER_1, WS, OP_SUBTRACT, LIT_HEXNUMBER_1,
WS, LIT_HEXNUMBER_1, EOF
);
}

@Test
public void testParseHex2() {
assertTokenTypes(
"1h 0h -5Fh -FFFFh 1BCh 5h -5h",
LIT_HEXNUMBER_2, LIT_HEXNUMBER_2, OP_SUBTRACT, LIT_HEXNUMBER_2, OP_SUBTRACT, LIT_HEXNUMBER_2, LIT_HEXNUMBER_2,
LIT_HEXNUMBER_2, OP_SUBTRACT, LIT_HEXNUMBER_2, EOF
LIT_HEXNUMBER_2, WS, LIT_HEXNUMBER_2, WS, OP_SUBTRACT, LIT_HEXNUMBER_2, WS, OP_SUBTRACT, LIT_HEXNUMBER_2,
WS, LIT_HEXNUMBER_2, WS, LIT_HEXNUMBER_2, WS, OP_SUBTRACT, LIT_HEXNUMBER_2, EOF
);
}

@Test
public void testParseDecimal() {
assertTokenTypes(
"0 1 -2 3 -4 5 66 999",
LIT_NUMBER, LIT_NUMBER, OP_SUBTRACT, LIT_NUMBER, LIT_NUMBER, OP_SUBTRACT, LIT_NUMBER, LIT_NUMBER, LIT_NUMBER,
LIT_NUMBER, EOF
LIT_NUMBER, WS, LIT_NUMBER, WS, OP_SUBTRACT, LIT_NUMBER, WS, LIT_NUMBER, WS, OP_SUBTRACT, LIT_NUMBER,
WS, LIT_NUMBER, WS, LIT_NUMBER, WS, LIT_NUMBER, EOF
);
}

@Test
public void testParseOctal() {
assertTokenTypes("-6o 7q 11q -345O", OP_SUBTRACT, LIT_OCTNUMBER, LIT_OCTNUMBER, LIT_OCTNUMBER, OP_SUBTRACT, LIT_OCTNUMBER, EOF);
assertTokenTypes(
"-6o 7q 11q -345O",
OP_SUBTRACT, LIT_OCTNUMBER, WS, LIT_OCTNUMBER, WS, LIT_OCTNUMBER, WS, OP_SUBTRACT, LIT_OCTNUMBER, EOF);
}

@Test
Expand All @@ -61,13 +64,13 @@ public void testParseBinary() {

@Test
public void testParseString1() {
assertTokenTypes("'' 'sss'", LIT_STRING_1, LIT_STRING_1, EOF);
assertTokenTypes("'' 'sss'", LIT_STRING_1, WS, LIT_STRING_1, EOF);
assertTokenTypes("'\nsss'", LIT_STRING_1, EOF);
}

@Test
public void testParseString2() {
assertTokenTypes("\"\" \"sss\"", LIT_STRING_2, LIT_STRING_2, EOF);
assertTokenTypes("\"\" \"sss\"", LIT_STRING_2, WS, LIT_STRING_2, EOF);
assertTokenTypes("\"\nsss\"", LIT_STRING_2, EOF);
}

Expand All @@ -83,14 +86,14 @@ public void testParseString2Error() {

@Test
public void testParseComment1() {
assertTokenTypes("// comment fun1", EOF);
assertTokenTypes("# comment fun1", EOF);
assertTokenTypes("; comment fun1", EOF);
assertTokenTypes("// comment fun1", COMMENT, EOF);
assertTokenTypes("# comment fun1", COMMENT, EOF);
assertTokenTypes("; comment fun1", COMMENT, EOF);
}

@Test
public void testParseComment2() {
assertTokenTypes("/*\n*\n* comment fun1\n\n*/", EOF);
assertTokenTypes("/*\n*\n* comment fun1\n\n*/", COMMENT2, EOF);
}

@Test
Expand Down Expand Up @@ -228,14 +231,14 @@ public void testOperators2() {

@Test
public void testIdentifier() {
assertTokenTypes("u @ ? _", ID_IDENTIFIER, ID_IDENTIFIER, ID_IDENTIFIER, ID_IDENTIFIER, EOF);
assertTokenTypes("a@ abc ZZ_ H005", ID_IDENTIFIER, ID_IDENTIFIER, ID_IDENTIFIER, ID_IDENTIFIER, EOF);
assertTokenTypes("u @ ? _", ID_IDENTIFIER, WS, ID_IDENTIFIER, WS, ID_IDENTIFIER, WS, ID_IDENTIFIER, EOF);
assertTokenTypes("a@ abc ZZ_ H005", ID_IDENTIFIER, WS, ID_IDENTIFIER, WS, ID_IDENTIFIER, WS, ID_IDENTIFIER, EOF);
}

@Test
public void testLabel() {
assertTokenTypes("u: @: ?: _:", ID_LABEL, ID_LABEL, ID_LABEL, ID_LABEL, EOF);
assertTokenTypes("a@: abc: ZZ_: H005:", ID_LABEL, ID_LABEL, ID_LABEL, ID_LABEL, EOF);
assertTokenTypes("u: @: ?: _:", ID_LABEL, WS, ID_LABEL, WS, ID_LABEL, WS, ID_LABEL, EOF);
assertTokenTypes("a@: abc: ZZ_: H005:", ID_LABEL, WS, ID_LABEL, WS, ID_LABEL, WS, ID_LABEL, EOF);
assertTokenTypes("a:", ID_LABEL, EOF);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.emustudio.plugins.compiler.as8080.parser;

import net.emustudio.plugins.compiler.as8080.As8080Parser;
import net.emustudio.plugins.compiler.as8080.ParsingUtils;
import net.emustudio.plugins.compiler.as8080.Utils;
import org.antlr.v4.runtime.Token;
Expand All @@ -9,6 +8,7 @@

import java.util.List;

import static net.emustudio.plugins.compiler.as8080.As8080Parser.*;
import static net.emustudio.plugins.compiler.as8080.Utils.assertTokenTypes;
import static net.emustudio.plugins.compiler.as8080.Utils.getTokens;
import static org.junit.Assert.assertEquals;
Expand All @@ -18,62 +18,61 @@ public class ParsingUtilsTest {
@Test
public void testParseLitString() {
List<Token> tokens = getTokens("'te\"x\"t1' \"te'x't2\"");
Utils.assertTokenTypes(tokens, As8080Parser.LIT_STRING_1, As8080Parser.LIT_STRING_2, As8080Parser.EOF);
Utils.assertTokenTypes(tokens, LIT_STRING_1, WS, LIT_STRING_2, EOF);
Assert.assertEquals("te\"x\"t1", ParsingUtils.parseLitString(tokens.get(0)));
assertEquals("te'x't2", ParsingUtils.parseLitString(tokens.get(1)));
assertEquals("te'x't2", ParsingUtils.parseLitString(tokens.get(2)));
}

@Test
public void testParseLitHex1() {
List<Token> tokens = getTokens("0x22F 0XAA55");
assertTokenTypes(tokens, As8080Parser.LIT_HEXNUMBER_1, As8080Parser.LIT_HEXNUMBER_1, As8080Parser.EOF);
assertTokenTypes(tokens, LIT_HEXNUMBER_1, WS, LIT_HEXNUMBER_1, EOF);
assertEquals(0x22F, ParsingUtils.parseLitHex1(tokens.get(0)));
assertEquals(0xAA55, ParsingUtils.parseLitHex1(tokens.get(1)));
assertEquals(0xAA55, ParsingUtils.parseLitHex1(tokens.get(2)));
}

@Test
public void testParseLitHex2() {
List<Token> tokens = getTokens("022Fh AA55H");
assertTokenTypes(tokens, As8080Parser.LIT_HEXNUMBER_2, As8080Parser.LIT_HEXNUMBER_2, As8080Parser.EOF);
assertTokenTypes(tokens, LIT_HEXNUMBER_2, WS, LIT_HEXNUMBER_2, EOF);
assertEquals(0x22F, ParsingUtils.parseLitHex2(tokens.get(0)));
assertEquals(0xAA55, ParsingUtils.parseLitHex2(tokens.get(1)));
assertEquals(0xAA55, ParsingUtils.parseLitHex2(tokens.get(2)));
}

@Test
public void testParseLitOct() {
List<Token> tokens = getTokens("22q 55O 77Q 001o");
assertTokenTypes(
tokens,
As8080Parser.LIT_OCTNUMBER, As8080Parser.LIT_OCTNUMBER, As8080Parser.LIT_OCTNUMBER,
As8080Parser.LIT_OCTNUMBER, As8080Parser.EOF
LIT_OCTNUMBER, WS, LIT_OCTNUMBER, WS, LIT_OCTNUMBER, WS, LIT_OCTNUMBER, EOF
);
assertEquals(18, ParsingUtils.parseLitOct(tokens.get(0)));
assertEquals(45, ParsingUtils.parseLitOct(tokens.get(1)));
assertEquals(63, ParsingUtils.parseLitOct(tokens.get(2)));
assertEquals(1, ParsingUtils.parseLitOct(tokens.get(3)));
assertEquals(45, ParsingUtils.parseLitOct(tokens.get(2)));
assertEquals(63, ParsingUtils.parseLitOct(tokens.get(4)));
assertEquals(1, ParsingUtils.parseLitOct(tokens.get(6)));
}

@Test
public void testParseLitDec() {
List<Token> tokens = getTokens("22 55 00");
assertTokenTypes(
tokens,
As8080Parser.LIT_NUMBER, As8080Parser.LIT_NUMBER, As8080Parser.LIT_NUMBER, As8080Parser.EOF
LIT_NUMBER, WS, LIT_NUMBER, WS, LIT_NUMBER, EOF
);
assertEquals(22, ParsingUtils.parseLitDec(tokens.get(0)));
assertEquals(55, ParsingUtils.parseLitDec(tokens.get(1)));
assertEquals(0, ParsingUtils.parseLitDec(tokens.get(2)));
assertEquals(55, ParsingUtils.parseLitDec(tokens.get(2)));
assertEquals(0, ParsingUtils.parseLitDec(tokens.get(4)));
}

@Test
public void testParseLitBin() {
List<Token> tokens = getTokens("000b 0101101b 111b");
assertTokenTypes(
tokens,
As8080Parser.LIT_BINNUMBER, As8080Parser.LIT_BINNUMBER, As8080Parser.LIT_BINNUMBER, As8080Parser.EOF
LIT_BINNUMBER, WS, LIT_BINNUMBER, WS, LIT_BINNUMBER, EOF
);
assertEquals(0, ParsingUtils.parseLitBin(tokens.get(0)));
assertEquals(45, ParsingUtils.parseLitBin(tokens.get(1)));
assertEquals(7, ParsingUtils.parseLitBin(tokens.get(2)));
assertEquals(45, ParsingUtils.parseLitBin(tokens.get(2)));
assertEquals(7, ParsingUtils.parseLitBin(tokens.get(4)));
}
}
4 changes: 2 additions & 2 deletions plugins/compiler/as-z80/src/main/antlr/AsZ80Lexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -110,15 +110,15 @@ COND_PE: P E ({(_input.LA(1) == -1) || (" ,\t\f\n\r;#/'\"()[]{}!=-+*<>\\%^&|$.".
COND_PO: P O ({(_input.LA(1) == -1) || (" ,\t\f\n\r;#/'\"()[]{}!=-+*<>\\%^&|$.".indexOf((char)_input.LA(1)) != -1) }?) -> popMode;
COND_P: P ({(_input.LA(1) == -1) || (" ,\t\f\n\r;#/'\"()[]{}!=-+*<>\\%^&|$.".indexOf((char)_input.LA(1)) != -1) }?) -> popMode;
COND_WS: [ \t\f]+ -> channel(HIDDEN);
ERROR_COND: () -> popMode,channel(HIDDEN);
ERROR_COND: () -> popMode,skip;

mode IM_NUMBER;
IM_01: '0/1' -> popMode;
IM_0: '0' -> popMode;
IM_1: '1' -> popMode;
IM_2: '2' -> popMode;
IM_WS: [ \t\f]+ -> channel(HIDDEN);
ERROR_IM: ({"012".indexOf((char) _input.LA(1)) == -1}?) -> popMode,channel(HIDDEN);
ERROR_IM: ({"012".indexOf((char) _input.LA(1)) == -1}?) -> popMode,skip;

mode DEFAULT_MODE;

Expand Down
Loading

0 comments on commit 2487d55

Please sign in to comment.