|
1 | 1 | const {ElectroGrammarLexer} = require('./ElectroGrammarLexer'); |
2 | 2 | const {ElectroGrammarParser} = require('./ElectroGrammarParser'); |
| 3 | +const {ElectroGrammarListener} = require('./ElectroGrammarListener'); |
3 | 4 | const {ToObjectListener} = require('./to_object_listener'); |
4 | 5 | const antlr4 = require('antlr4'); |
5 | 6 |
|
6 | | -class LexerIgnoreListener extends antlr4.error.ErrorListener { |
| 7 | +class IgnoreListener extends ElectroGrammarListener { |
7 | 8 | constructor() { |
8 | 9 | super(); |
9 | | - this.ignored = ''; |
| 10 | + this.obj = ''; |
10 | 11 | } |
11 | | - syntaxError(lexer, offendingSymbol, line, char, err) { |
12 | | - console.error('lexer:', err); |
13 | | - // hopefully there is a better way to get the input, but I haven't found it |
14 | | - let input = err.split(':')[1].trim(); |
15 | | - input = input.substring(1, input.length - 1); |
16 | | - this.ignored += input; |
| 12 | + exitIgnored(ctx) { |
| 13 | + ctx.UNKNOWN().forEach(s => { |
| 14 | + this.obj += s.getText(); |
| 15 | + }); |
17 | 16 | } |
18 | 17 | } |
19 | 18 |
|
20 | | -class ParserIgnoreListener extends antlr4.error.ErrorListener { |
21 | | - constructor() { |
22 | | - super(); |
23 | | - this.ignored = ''; |
24 | | - } |
25 | | - syntaxError(lexer, offendingSymbol, line, char, err) { |
26 | | - console.error('parser:', err); |
27 | | - //this.ignored += input; |
| 19 | +function get_parser(start_rule, listener) { |
| 20 | + function parse(input) { |
| 21 | + const chars = new antlr4.InputStream(input); |
| 22 | + const lexer = new ElectroGrammarLexer(chars); |
| 23 | + const tokens = new antlr4.CommonTokenStream(lexer); |
| 24 | + const parser = new ElectroGrammarParser(tokens); |
| 25 | + parser.buildParseTrees = true; |
| 26 | + |
| 27 | + const tree = parser[start_rule](); |
| 28 | + antlr4.tree.ParseTreeWalker.DEFAULT.walk(listener, tree); |
| 29 | + return listener.obj; |
28 | 30 | } |
| 31 | + return parse; |
29 | 32 | } |
30 | 33 |
|
31 | 34 | function parse(input) { |
32 | | - const chars = new antlr4.InputStream(input); |
33 | | - const lexer = new ElectroGrammarLexer(chars); |
34 | | - const lexerIgnorer = new LexerIgnoreListener(); |
35 | | - lexer.removeErrorListeners(); |
36 | | - lexer.addErrorListener(lexerIgnorer); |
37 | | - const tokens = new antlr4.CommonTokenStream(lexer); |
38 | | - const parser = new ElectroGrammarParser(tokens); |
39 | | - const parserIgnorer = new ParserIgnoreListener(); |
40 | | - parser.buildParseTrees = true; |
41 | | - parser.removeErrorListeners(); |
42 | | - parser.addErrorListener(parserIgnorer); |
| 35 | + return get_parser('electro_grammar')(input); |
| 36 | +} |
43 | 37 |
|
44 | | - const tree = parser.electro_grammar(); |
45 | | - const listener = new ToObjectListener(); |
46 | | - const walker = antlr4.tree.ParseTreeWalker.DEFAULT.walk(listener, tree); |
47 | | - console.log({lexer: lexerIgnorer.ignored, parser: parserIgnorer.ignored}); |
48 | | - return {component: listener.obj, ignored: lexerIgnorer.ignored}; |
| 38 | +function parse(input) { |
| 39 | + const parseComponent = get_parser('electro_grammar', new ToObjectListener()); |
| 40 | + const component = parseComponent(input); |
| 41 | + const parseIgnored = get_parser('ignored', new IgnoreListener()); |
| 42 | + const ignored = parseIgnored(input); |
| 43 | + return {component, ignored}; |
49 | 44 | } |
50 | 45 |
|
51 | 46 | module.exports = {parse}; |
0 commit comments