-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make sure escape chars in a edge labels in the DOT generator are all …
…replaced correctly Fixes #33.
- Loading branch information
1 parent
313d194
commit 18cc77d
Showing
4 changed files
with
155 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* | ||
* Copyright (c) Mike Lischke. All rights reserved. | ||
* Licensed under the MIT License. See License.txt in the project root for license information. | ||
*/ | ||
|
||
import { readFile } from "node:fs/promises"; | ||
import { dirname, join } from "node:path"; | ||
|
||
import { beforeAll, beforeEach, describe, expect, it } from "vitest"; | ||
|
||
import { DOTGenerator } from "../../src/tool/DOTGenerator.js"; | ||
import { Grammar, LexerGrammar } from "../../src/tool/index.js"; | ||
|
||
describe("DOTGenerator", () => { | ||
let lexerGrammar: Grammar; | ||
let dotGenerator: DOTGenerator; | ||
|
||
beforeAll(async () => { | ||
const sourcePath = join(dirname(import.meta.url), "data/abbLexer.g4").substring("file:".length); | ||
const lexerGrammarText = await readFile(sourcePath, "utf8"); | ||
lexerGrammar = new LexerGrammar(lexerGrammarText); | ||
lexerGrammar.tool.process(lexerGrammar, false); | ||
|
||
}); | ||
|
||
beforeEach(() => { | ||
dotGenerator = new DOTGenerator(lexerGrammar); | ||
}); | ||
|
||
it("Bug #33", () => { | ||
const rule = lexerGrammar.getRule("EscapeSequence")!; | ||
const startState = lexerGrammar.atn!.ruleToStartState[rule.index]!; | ||
const result = dotGenerator.getDOTFromState(startState, true); | ||
expect(result.indexOf(`s327 -> s335 [fontsize=11, fontname="Courier", arrowsize=.7, ` + | ||
String.raw`label = "'\\\\'", arrowhead = normal];`)).toBeGreaterThan(-1); | ||
}); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
// $antlr-format alignTrailingComments true, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments false, useTab false | ||
// $antlr-format allowShortRulesOnASingleLine true, allowShortBlocksOnASingleLine true, minEmptyLines 0, alignSemicolons ownLine | ||
// $antlr-format alignColons trailing, singleLineOverrulesHangingColon true, alignLexerCommands true, alignLabels true, alignTrailers true | ||
|
||
lexer grammar abbLexer; | ||
|
||
options { | ||
caseInsensitive = true; | ||
} | ||
|
||
MODULE : 'module'; | ||
ENDMODULE : 'endmodule'; | ||
PROC : 'PROC'; | ||
ENDPROC : 'ENDPROC'; | ||
LOCAL : 'LOCAL'; | ||
CONST : 'CONST'; | ||
PERS : 'PERS'; | ||
VAR : 'VAR'; | ||
TOOLDATA : 'TOOLDATA'; | ||
WOBJDATA : 'WOBJDATA'; | ||
SPEEDDATA : 'SPEEDDATA'; | ||
ZONEDATA : 'ZONEDATA'; | ||
CLOCK : 'CLOCK'; | ||
BOOL : 'BOOL'; | ||
ON_CALL : '\\ON'; | ||
OFF_CALL : '\\OFF'; | ||
|
||
SLASH : '/'; | ||
EQUALS : ':='; | ||
COMMA : ','; | ||
CURLY_OPEN : '{'; | ||
CURLY_CLOSE : '}'; | ||
COLON : ':'; | ||
SEMICOLON : ';'; | ||
BRACKET_OPEN : '('; | ||
BRACKET_CLOSE : ')'; | ||
SQUARE_OPEN : '['; | ||
SQUARE_CLOSE : ']'; | ||
DOT : '.'; | ||
DOUBLEDOT : '..'; | ||
REL_BIGGER : '>'; | ||
REL_BIGGER_OR_EQUAL : '>='; | ||
REL_SMALLER : '<'; | ||
REL_SMALLER_OR_EQUAL : '<='; | ||
REL_EQUAL : '=='; | ||
REL_NOTEQUAL : '<>'; | ||
PLUS : '+'; | ||
MINUS : '-'; | ||
MULTIPLY : '*'; | ||
PERCENT : '%'; | ||
HASH : '#'; | ||
|
||
WS: (' ' | '\t' | '\u000C') -> skip; | ||
|
||
NEWLINE: '\r'? '\n'; | ||
|
||
LINE_COMMENT: '!' ~ ('\n' | '\r')* -> skip; | ||
|
||
BOOLLITERAL: 'FALSE' | 'TRUE'; | ||
|
||
CHARLITERAL: '\'' (EscapeSequence | ~ ('\'' | '\\' | '\r' | '\n')) '\''; | ||
|
||
STRINGLITERAL: '"' (EscapeSequence | ~ ('\\' | '"' | '\r' | '\n'))* '"'; | ||
|
||
fragment EscapeSequence: | ||
'\\' ( | ||
'b' | ||
| 't' | ||
| 'n' | ||
| 'f' | ||
| 'r' | ||
| '"' | ||
| '\'' | ||
| '\\' | ||
| '0' .. '3' '0' .. '7' '0' .. '7' | ||
| '0' .. '7' '0' .. '7' | ||
| '0' .. '7' | ||
) | ||
; | ||
|
||
FLOATLITERAL: | ||
('0' .. '9')+ '.' ('0' .. '9')* Exponent? | ||
| '.' ('0' .. '9')+ Exponent? | ||
| ('0' .. '9')+ Exponent | ||
; | ||
|
||
fragment Exponent: 'E' ('+' | '-')? ('0' .. '9')+; | ||
|
||
INTLITERAL: ('0' .. '9')+ | HexPrefix HexDigit+ HexSuffix | BinPrefix BinDigit+ BinSuffix; | ||
|
||
fragment HexPrefix: '\'' 'H'; | ||
|
||
fragment HexDigit: '0' .. '9' | 'A' .. 'F'; | ||
|
||
fragment HexSuffix: '\''; | ||
|
||
fragment BinPrefix: '\'' 'B'; | ||
|
||
fragment BinDigit: '0' | '1'; | ||
|
||
fragment BinSuffix: '\''; | ||
|
||
IDENTIFIER: IdentifierStart IdentifierPart*; | ||
|
||
fragment IdentifierStart: 'A' .. 'Z' | '_'; | ||
|
||
fragment IdentifierPart: IdentifierStart | '0' .. '9'; |