2016-06-03 17 views
0

Ich schreibe einen JS-Parser mit Antlr4. Ich benutze grundsätzlich die Grammatikdatei, die auf dem Antlr-Grammatik-Repository (ECMAScript.g4) als Basis veröffentlicht wurde.ANTLR4 Javascript Parser RegExp und Division Operator Konflikt

Die Grammatik definiert die Regex-Regel wie folgt, was an sich kein Problem darstellt.

RegularExpressionLiteral: '/' RegularExpressionBody '/' RegularExpressionFlags ;

jedoch denkt, dass der Parser einen Ausdruck Code wie dieser Regex.

var x = a/b + c/d;

Ich frage mich, ob es eine einfache Lösung für diesen Konflikt ist. Vielen Dank!

Antwort

1

Sie haben wahrscheinlich nicht den gesamten Code aus der Grammatik eingegeben. Stellen Sie sicher, dass der gesamte Code innerhalb der @member Blöcke enthalten ist: Sie sind dafür verantwortlich, zu bestimmen, ob ein / als Divisionsoperator oder als Regex-Begrenzer betrachtet werden soll.

Wenn ich die folgende Testklasse laufen:

public class Main { 

    public static void main(String[] args) throws Exception { 
     ECMAScriptLexer lexer = new ECMAScriptLexer(new ANTLRInputStream("var x = a/b + c/d;")); 
     ECMAScriptParser parser = new ECMAScriptParser(new CommonTokenStream(lexer)); 
     ECMAScriptParser.ProgramContext ctx = parser.program(); 
     new TreeViewer(Arrays.asList(ECMAScriptParser.ruleNames), ctx).open(); 
    } 
} 

Der folgende Bildschirm wird angezeigt:

enter image description here

+0

Wow, Sie sind einer der Mitwirkenden der Grammatik. Ich danke dir für deinen Kommentar. Ok, ich habe den Java-Code aus dem @memeber-Bereich entfernt, weil meine Zielsprache JavaScript war. Ich habe total vergessen, dass ich es getan habe! Ich brauchte einen Javascript-Parser, der in einer Javascript-Umgebung lief. Ich werde den Code in JS umschreiben. Danke Bart. – yoshi

+0

Gern geschehen, Yoshi. –