use of org.antlr.v4.runtime.Parser in project antlr4 by antlr.
the class TestATNConstruction method testAorBstar.
@Test
public void testAorBstar() throws Exception {
Grammar g = new Grammar("parser grammar P;\n" + "a : (A | B{;})* ;");
String expecting = "RuleStart_a_0->StarLoopEntry_7\n" + "StarLoopEntry_7->StarBlockStart_5\n" + "StarLoopEntry_7->s8\n" + "StarBlockStart_5->s2\n" + "StarBlockStart_5->s3\n" + "s8->RuleStop_a_1\n" + "s2-A->BlockEnd_6\n" + "s3-B->s4\n" + "RuleStop_a_1-EOF->s10\n" + "BlockEnd_6->StarLoopBack_9\n" + "s4-action_0:-1->BlockEnd_6\n" + "StarLoopBack_9->StarLoopEntry_7\n";
checkRuleATN(g, "a", expecting);
}
use of org.antlr.v4.runtime.Parser in project antlr4 by antlr.
the class TestATNConstruction method testSetAorBoptional.
@Test
public void testSetAorBoptional() throws Exception {
Grammar g = new Grammar("parser grammar P;\n" + "a : (A|B)?;");
String expecting = "RuleStart_a_0->BlockStart_3\n" + "BlockStart_3->s2\n" + "BlockStart_3->BlockEnd_4\n" + "s2-{A, B}->BlockEnd_4\n" + "BlockEnd_4->RuleStop_a_1\n" + "RuleStop_a_1-EOF->s5\n";
checkRuleATN(g, "a", expecting);
}
use of org.antlr.v4.runtime.Parser in project antlr4 by antlr.
the class TestATNConstruction method testA.
@Test
public void testA() throws Exception {
Grammar g = new Grammar("parser grammar P;\n" + "a : A;");
String expecting = "RuleStart_a_0->s2\n" + "s2-A->s3\n" + "s3->RuleStop_a_1\n" + "RuleStop_a_1-EOF->s4\n";
checkRuleATN(g, "a", expecting);
}
use of org.antlr.v4.runtime.Parser in project antlr4 by antlr.
the class TreeViewer method showInDialog.
protected static JFrame showInDialog(final TreeViewer viewer) {
final JFrame dialog = new JFrame();
dialog.setTitle("Parse Tree Inspector");
final Preferences prefs = Preferences.userNodeForPackage(TreeViewer.class);
// Make new content panes
final Container mainPane = new JPanel(new BorderLayout(5, 5));
final Container contentPane = new JPanel(new BorderLayout(0, 0));
contentPane.setBackground(Color.white);
// Wrap viewer in scroll pane
JScrollPane scrollPane = new JScrollPane(viewer);
// Make the scrollpane (containing the viewer) the center component
contentPane.add(scrollPane, BorderLayout.CENTER);
JPanel wrapper = new JPanel(new FlowLayout());
// Add button to bottom
JPanel bottomPanel = new JPanel(new BorderLayout(0, 0));
contentPane.add(bottomPanel, BorderLayout.SOUTH);
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispatchEvent(new WindowEvent(dialog, WindowEvent.WINDOW_CLOSING));
}
});
wrapper.add(ok);
// Add an export-to-png button right of the "OK" button
JButton png = new JButton("Export as PNG");
png.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
generatePNGFile(viewer, dialog);
}
});
wrapper.add(png);
bottomPanel.add(wrapper, BorderLayout.SOUTH);
// Add scale slider
double lastKnownViewerScale = prefs.getDouble(DIALOG_VIEWER_SCALE_PREFS_KEY, viewer.getScale());
viewer.setScale(lastKnownViewerScale);
int sliderValue = (int) ((lastKnownViewerScale - 1.0) * 1000);
final JSlider scaleSlider = new JSlider(JSlider.HORIZONTAL, -999, 1000, sliderValue);
scaleSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int v = scaleSlider.getValue();
viewer.setScale(v / 1000.0 + 1.0);
}
});
bottomPanel.add(scaleSlider, BorderLayout.CENTER);
// Add a JTree representing the parser tree of the input.
JPanel treePanel = new JPanel(new BorderLayout(5, 5));
// An "empty" icon that will be used for the JTree's nodes.
Icon empty = new EmptyIcon();
UIManager.put("Tree.closedIcon", empty);
UIManager.put("Tree.openIcon", empty);
UIManager.put("Tree.leafIcon", empty);
Tree parseTreeRoot = viewer.getTree().getRoot();
TreeNodeWrapper nodeRoot = new TreeNodeWrapper(parseTreeRoot, viewer);
fillTree(nodeRoot, parseTreeRoot, viewer);
final JTree tree = new JTree(nodeRoot);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
JTree selectedTree = (JTree) e.getSource();
TreePath path = selectedTree.getSelectionPath();
if (path != null) {
TreeNodeWrapper treeNode = (TreeNodeWrapper) path.getLastPathComponent();
// Set the clicked AST.
viewer.setTree((Tree) treeNode.getUserObject());
}
}
});
treePanel.add(new JScrollPane(tree));
// Create the pane for both the JTree and the AST
final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treePanel, contentPane);
mainPane.add(splitPane, BorderLayout.CENTER);
dialog.setContentPane(mainPane);
// make viz
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
prefs.putInt(DIALOG_WIDTH_PREFS_KEY, (int) dialog.getSize().getWidth());
prefs.putInt(DIALOG_HEIGHT_PREFS_KEY, (int) dialog.getSize().getHeight());
prefs.putDouble(DIALOG_X_PREFS_KEY, dialog.getLocationOnScreen().getX());
prefs.putDouble(DIALOG_Y_PREFS_KEY, dialog.getLocationOnScreen().getY());
prefs.putInt(DIALOG_DIVIDER_LOC_PREFS_KEY, splitPane.getDividerLocation());
prefs.putDouble(DIALOG_VIEWER_SCALE_PREFS_KEY, viewer.getScale());
dialog.setVisible(false);
dialog.dispose();
}
};
dialog.addWindowListener(exitListener);
dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
int width = prefs.getInt(DIALOG_WIDTH_PREFS_KEY, 600);
int height = prefs.getInt(DIALOG_HEIGHT_PREFS_KEY, 500);
dialog.setPreferredSize(new Dimension(width, height));
dialog.pack();
// After pack(): set the divider at 1/3 (200/600) of the frame.
int dividerLocation = prefs.getInt(DIALOG_DIVIDER_LOC_PREFS_KEY, 200);
splitPane.setDividerLocation(dividerLocation);
if (prefs.getDouble(DIALOG_X_PREFS_KEY, -1) != -1) {
dialog.setLocation((int) prefs.getDouble(DIALOG_X_PREFS_KEY, 100), (int) prefs.getDouble(DIALOG_Y_PREFS_KEY, 100));
} else {
dialog.setLocationRelativeTo(null);
}
dialog.setVisible(true);
return dialog;
}
use of org.antlr.v4.runtime.Parser in project antlr4 by antlr.
the class SemanticPipeline method assignLexerTokenTypes.
void assignLexerTokenTypes(Grammar g, List<GrammarAST> tokensDefs) {
// put in root, even if imported
Grammar G = g.getOutermostGrammar();
for (GrammarAST def : tokensDefs) {
// tokens { id (',' id)* } so must check IDs not TOKEN_REF
if (Grammar.isTokenName(def.getText())) {
G.defineTokenName(def.getText());
}
}
/* Define token types for nonfragment rules which do not include a 'type(...)'
* or 'more' lexer command.
*/
for (Rule r : g.rules.values()) {
if (!r.isFragment() && !hasTypeOrMoreCommand(r)) {
G.defineTokenName(r.name);
}
}
// FOR ALL X : 'xxx'; RULES, DEFINE 'xxx' AS TYPE X
List<Pair<GrammarAST, GrammarAST>> litAliases = Grammar.getStringLiteralAliasesFromLexerRules(g.ast);
Set<String> conflictingLiterals = new HashSet<String>();
if (litAliases != null) {
for (Pair<GrammarAST, GrammarAST> pair : litAliases) {
GrammarAST nameAST = pair.a;
GrammarAST litAST = pair.b;
if (!G.stringLiteralToTypeMap.containsKey(litAST.getText())) {
G.defineTokenAlias(nameAST.getText(), litAST.getText());
} else {
// oops two literal defs in two rules (within or across modes).
conflictingLiterals.add(litAST.getText());
}
}
for (String lit : conflictingLiterals) {
// Remove literal if repeated across rules so it's not
// found by parser grammar.
Integer value = G.stringLiteralToTypeMap.remove(lit);
if (value != null && value > 0 && value < G.typeToStringLiteralList.size() && lit.equals(G.typeToStringLiteralList.get(value))) {
G.typeToStringLiteralList.set(value, null);
}
}
}
}
Aggregations