diff --git a/.travis.yml b/.travis.yml index 310be54..1b7f545 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,4 +19,5 @@ script: - make - npm test - npm run fmt + - git diff - git diff --quiet diff --git a/js/bin/electro-grammar.js b/js/bin/electro-grammar.js index 3b66343..8dab18a 100644 --- a/js/bin/electro-grammar.js +++ b/js/bin/electro-grammar.js @@ -1,5 +1,5 @@ const cli = require('cli'); -const lib = require('../lib/index'); +const lib = require('../lib/lax_parser'); const args = cli.parse({ parser: [ 'p', 'Parser to use (strict | lax)', 'string', 'strict' ], diff --git a/js/lib/lax_parser.js b/js/lib/lax_parser.js index a5028d3..8da2675 100644 --- a/js/lib/lax_parser.js +++ b/js/lib/lax_parser.js @@ -1,51 +1,46 @@ const {ElectroGrammarLexer} = require('./ElectroGrammarLexer'); const {ElectroGrammarParser} = require('./ElectroGrammarParser'); +const {ElectroGrammarListener} = require('./ElectroGrammarListener'); const {ToObjectListener} = require('./to_object_listener'); const antlr4 = require('antlr4'); -class LexerIgnoreListener extends antlr4.error.ErrorListener { +class IgnoreListener extends ElectroGrammarListener { constructor() { super(); - this.ignored = ''; + this.obj = ''; } - syntaxError(lexer, offendingSymbol, line, char, err) { - console.error('lexer:', err); - // hopefully there is a better way to get the input, but I haven't found it - let input = err.split(':')[1].trim(); - input = input.substring(1, input.length - 1); - this.ignored += input; + exitIgnored(ctx) { + ctx.UNKNOWN().forEach(s => { + this.obj += s.getText(); + }); } } -class ParserIgnoreListener extends antlr4.error.ErrorListener { - constructor() { - super(); - this.ignored = ''; - } - syntaxError(lexer, offendingSymbol, line, char, err) { - console.error('parser:', err); - //this.ignored += input; +function get_parser(start_rule, listener) { + function parse(input) { + const chars = new antlr4.InputStream(input); + const lexer = new ElectroGrammarLexer(chars); + const tokens = new antlr4.CommonTokenStream(lexer); + const parser = new ElectroGrammarParser(tokens); + parser.buildParseTrees = true; + + const tree = parser[start_rule](); + antlr4.tree.ParseTreeWalker.DEFAULT.walk(listener, tree); + return listener.obj; } + return parse; } function parse(input) { - const chars = new antlr4.InputStream(input); - const lexer = new ElectroGrammarLexer(chars); - const lexerIgnorer = new LexerIgnoreListener(); - lexer.removeErrorListeners(); - lexer.addErrorListener(lexerIgnorer); - const tokens = new antlr4.CommonTokenStream(lexer); - const parser = new ElectroGrammarParser(tokens); - const parserIgnorer = new ParserIgnoreListener(); - parser.buildParseTrees = true; - parser.removeErrorListeners(); - parser.addErrorListener(parserIgnorer); + return get_parser('electro_grammar')(input); +} - const tree = parser.electro_grammar(); - const listener = new ToObjectListener(); - const walker = antlr4.tree.ParseTreeWalker.DEFAULT.walk(listener, tree); - console.log({lexer: lexerIgnorer.ignored, parser: parserIgnorer.ignored}); - return {component: listener.obj, ignored: lexerIgnorer.ignored}; +function parse(input) { + const parseComponent = get_parser('electro_grammar', new ToObjectListener()); + const component = parseComponent(input); + const parseIgnored = get_parser('ignored', new IgnoreListener()); + const ignored = parseIgnored(input); + return {component, ignored}; } module.exports = {parse}; diff --git a/src/ElectroGrammar.g4 b/src/ElectroGrammar.g4 index 90983ae..411e45a 100644 --- a/src/ElectroGrammar.g4 +++ b/src/ElectroGrammar.g4 @@ -1,10 +1,8 @@ -/* - * Lexer Rules - */ - grammar ElectroGrammar; -import Passive, Semi; +import Passive; + +electro_grammar: passive EOF; -electro_grammar: (passive | semi) EOF; +ignored: UNKNOWN* EOF; -WHITESPACE: [\p{White_Space}] -> skip; +UNKNOWN: .+?; diff --git a/src/Passive.g4 b/src/Passive.g4 index 97c1cdd..6f45b37 100644 --- a/src/Passive.g4 +++ b/src/Passive.g4 @@ -1,22 +1,6 @@ grammar Passive; -import Dielectric, Package, Units; +import Units; -passive: resistor | capacitor | inductor | oscillator; +passive: resistor; -passive: resistor | capacitor | inductor | oscillator; -resistor: resistance rspec*; -rspec: rtype | rpackage | power; -rtype: POT; -rpackage: package_chip; -POT: P O T | P O T E N T I O M E T E R; - -capacitor: capacitance cspec*; -cspec: dielectric | cpackage | voltage; -cpackage: package_chip; - -inductor: inductance lspec*; -lspec: lpackage | current; -lpackage: package_chip; - -oscillator: frequency ospec*; -ospec: capacitance; +resistor: resistance; diff --git a/src/Units.g4 b/src/Units.g4 index b911b36..51bb887 100644 --- a/src/Units.g4 +++ b/src/Units.g4 @@ -48,8 +48,8 @@ aprefix: MILI | MICRO | NANO | PICO; power: NUMBER pprefix? WATT tolerance?; pprefix: MILI; -resistance: NUMBER (rprefix | OHM) tolerance?; -rprefix: MEGA | KILO | MILI; +resistance: NUMBER (RPREFIX | OHM); +RPREFIX: MEGA | KILO | MILI; capacitance: NUMBER cprefix FARAD tolerance?; cprefix: MICRO | NANO | PICO;