/* * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. * Use of this file is governed by the BSD 3-clause license that * can be found in the LICENSE.txt file in the project root. */ package org.antlr.v4.test.tool; import org.antlr.v4.gui.Trees; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.InterpreterRuleContext; import org.antlr.v4.runtime.LexerInterpreter; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.tool.Grammar; import org.antlr.v4.tool.GrammarParserInterpreter; import org.antlr.v4.tool.LexerGrammar; import org.junit.Test; import static org.junit.Assert.assertEquals; /** Tests to ensure GrammarParserInterpreter subclass of ParserInterpreter * hasn't messed anything up. */ public class TestGrammarParserInterpreter { public static final String lexerText = "lexer grammar L;\n" + "PLUS : '+' ;\n" + "MULT : '*' ;\n" + "ID : [a-z]+ ;\n" + "INT : [0-9]+ ;\n" + "WS : [ \\r\\t\\n]+ ;\n"; @Test public void testAlts() throws Exception { LexerGrammar lg = new LexerGrammar(lexerText); Grammar g = new Grammar( "parser grammar T;\n" + "s : ID\n"+ " | INT{;}\n"+ " ;\n", lg); testInterp(lg, g, "s", "a", "(s:1 a)"); testInterp(lg, g, "s", "3", "(s:2 3)"); } @Test public void testAltsAsSet() throws Exception { LexerGrammar lg = new LexerGrammar(lexerText); Grammar g = new Grammar( "parser grammar T;\n" + "s : ID\n"+ " | INT\n"+ " ;\n", lg); testInterp(lg, g, "s", "a", "(s:1 a)"); testInterp(lg, g, "s", "3", "(s:1 3)"); } @Test public void testAltsWithLabels() throws Exception { LexerGrammar lg = new LexerGrammar(lexerText); Grammar g = new Grammar( "parser grammar T;\n" + "s : ID # foo\n" + " | INT # bar\n" + " ;\n", lg); // it won't show the labels here because my simple node text provider above just shows the alternative testInterp(lg, g, "s", "a", "(s:1 a)"); testInterp(lg, g, "s", "3", "(s:2 3)"); } @Test public void testOneAlt() throws Exception { LexerGrammar lg = new LexerGrammar(lexerText); Grammar g = new Grammar( "parser grammar T;\n" + "s : ID\n"+ " ;\n", lg); testInterp(lg, g, "s", "a", "(s:1 a)"); } @Test public void testLeftRecursionWithMultiplePrimaryAndRecursiveOps() throws Exception { LexerGrammar lg = new LexerGrammar(lexerText); Grammar g = new Grammar( "parser grammar T;\n" + "s : e EOF ;\n" + "e : e MULT e\n" + " | e PLUS e\n" + " | INT\n" + " | ID\n" + " ;\n", lg); testInterp(lg, g, "s", "a", "(s:1 (e:4 a) <EOF>)"); testInterp(lg, g, "e", "a", "(e:4 a)"); testInterp(lg, g, "e", "34", "(e:3 34)"); testInterp(lg, g, "e", "a+1", "(e:2 (e:4 a) + (e:3 1))"); testInterp(lg, g, "e", "1+2*a", "(e:2 (e:3 1) + (e:1 (e:3 2) * (e:4 a)))"); } InterpreterRuleContext testInterp(LexerGrammar lg, Grammar g, String startRule, String input, String expectedParseTree) { LexerInterpreter lexEngine = lg.createLexerInterpreter(new ANTLRInputStream(input)); CommonTokenStream tokens = new CommonTokenStream(lexEngine); GrammarParserInterpreter parser = g.createGrammarParserInterpreter(tokens); ParseTree t = parser.parse(g.rules.get(startRule).index); InterpreterTreeTextProvider nodeTextProvider = new InterpreterTreeTextProvider(g.getRuleNames()); String treeStr = Trees.toStringTree(t, nodeTextProvider); // System.out.println("parse tree: "+treeStr); assertEquals(expectedParseTree, treeStr); return (InterpreterRuleContext)t; } }