You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by lk...@apache.org on 2022/10/17 17:44:08 UTC
[netbeans] branch master updated: ANTLRv4 indent and code snippet support. (#4800)
This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new abb1a97c84 ANTLRv4 indent and code snippet support. (#4800)
abb1a97c84 is described below
commit abb1a97c84e22da99cd38640d52f57e029fa2dbb
Author: Laszlo Kishalmi <la...@gmail.com>
AuthorDate: Mon Oct 17 10:44:02 2022 -0700
ANTLRv4 indent and code snippet support. (#4800)
* Add indenting support for ANTLRv4 grammars
* Removed console error listeners, fixed a couple of potential NPE-s
* Added code snippets for ANTLR v4 Grammars
* ANTLR indent set to 4 be default
---
.../modules/languages/antlr/AntlrParserResult.java | 1 -
.../org/netbeans/modules/languages/antlr/layer.xml | 13 ++
.../languages/antlr/v3/Antlr3ParserResult.java | 5 +-
.../modules/languages/antlr/v3/preferences.xml | 28 ++++
.../antlr/v4/Antlr4CompletionProvider.java | 26 +---
.../languages/antlr/v4/Antlr4Formatter.java | 149 +++++++++++++++++++++
.../modules/languages/antlr/v4/Antlr4Language.java | 11 ++
.../languages/antlr/v4/Antlr4ParserResult.java | 25 +++-
.../modules/languages/antlr/v4/preferences.xml | 28 ++++
.../modules/languages/antlr/v4/snippets.xml | 56 ++++++++
10 files changed, 314 insertions(+), 28 deletions(-)
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java
index eaaae99e85..009e288dd6 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java
@@ -64,7 +64,6 @@ public abstract class AntlrParserResult<T extends Parser> extends ParserResult {
public AntlrParserResult get() {
if (! finished) {
- FileObject fo = getSnapshot().getSource().getFileObject();
T parser = createParser(getSnapshot());
parser.addErrorListener(createErrorListener());
parser.addParseListener(createFoldListener());
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml
index 0972a92bfa..d956ef1f30 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml
@@ -41,6 +41,11 @@
</folder>
</folder>
</folder>
+ <folder name="Preferences">
+ <folder name="Defaults">
+ <file name="org-netbeans-modules-languages-antlr-v3-preferences.xml" url="v3/preferences.xml"/>
+ </folder>
+ </folder>
</folder>
<folder name="x-antlr4">
<attr name="displayName" bundlevalue="org.netbeans.modules.languages.antlr.Bundle#Editors/text/x-antlr4"/>
@@ -60,6 +65,14 @@
</folder>
</folder>
</folder>
+ <folder name="CodeTemplates">
+ <file name="org-netbeans-modules-languages-antlr-v4-snippets.xml" url="v4/snippets.xml"/>
+ </folder>
+ <folder name="Preferences">
+ <folder name="Defaults">
+ <file name="org-netbeans-modules-languages-antlr-v4-preferences.xml" url="v4/preferences.xml"/>
+ </folder>
+ </folder>
</folder>
</folder>
</folder>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
index 74b325bef8..81e01bbc28 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
@@ -26,6 +26,7 @@ import org.antlr.parser.antlr3.ANTLRv3ParserBaseListener;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.ConsoleErrorListener;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.netbeans.modules.csl.api.OffsetRange;
@@ -50,7 +51,9 @@ public final class Antlr3ParserResult extends AntlrParserResult<ANTLRv3Parser> {
CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText()));
ANTLRv3Lexer lexer = new ANTLRv3Lexer(cs);
CommonTokenStream tokens = new CommonTokenStream(lexer);
- return new ANTLRv3Parser(tokens);
+ ANTLRv3Parser ret = new ANTLRv3Parser(tokens);
+ ret.removeErrorListener(ConsoleErrorListener.INSTANCE);
+ return ret;
}
@Override
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/preferences.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/preferences.xml
new file mode 100644
index 0000000000..29d9676ecb
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/preferences.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE editor-preferences PUBLIC "-//NetBeans//DTD Editor Preferences 1.0//EN" "http://www.netbeans.org/dtds/EditorPreferences-1_0.dtd">
+
+<editor-preferences>
+ <entry category="private" name="custom-action-list" value="org.netbeans.modules.languages.yaml.InsertTabAction.createCustomActions" />
+ <entry javaType="java.lang.Boolean" name="enable-indent" xml:space="preserve"><value>true</value></entry>
+ <entry javaType="java.lang.Integer" name="indent-shift-width" xml:space="preserve"><value>4</value></entry>
+</editor-preferences>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4CompletionProvider.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4CompletionProvider.java
index b072a74d02..a2a3a985ea 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4CompletionProvider.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4CompletionProvider.java
@@ -33,8 +33,6 @@ import org.antlr.parser.antlr4.ANTLRv4Lexer;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.Token;
import org.netbeans.api.editor.document.EditorDocumentUtils;
-import org.netbeans.api.editor.document.LineDocument;
-import org.netbeans.api.editor.document.LineDocumentUtils;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.mimelookup.MimePath;
import org.netbeans.api.editor.mimelookup.MimeRegistration;
@@ -86,18 +84,6 @@ public class Antlr4CompletionProvider implements CompletionProvider {
this.caseSensitive = caseSensitive;
}
- //TODO: This is a Lexer based pretty dumb implementation. Only offer
- // prefix if the cursor is at the end of a start of token/lexer rule.
- // Shall be replaced with a better approach.
- private String getPrefix(Document doc, int caretOffset, boolean upToOffset) throws BadLocationException {
- LineDocument lineDoc = LineDocumentUtils.asRequired(doc, LineDocument.class);
- int start = LineDocumentUtils.getWordStart(lineDoc, caretOffset);
- int end = LineDocumentUtils.getWordEnd(lineDoc, caretOffset);
- String prefix = doc.getText(start, (upToOffset ? caretOffset : end) - start);
-
- return (prefix.length() > 0) && !Character.isWhitespace(prefix.codePointAt(prefix.length() - 1)) ? prefix : "";
- }
-
@Override
protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) {
AbstractDocument adoc = (AbstractDocument) doc;
@@ -143,12 +129,10 @@ public class Antlr4CompletionProvider implements CompletionProvider {
tokens.previous();
lookAround(fo, tokens, caretOffset, prefix, resultSet);
} else {
- //Empty grammar so far offer lexer and grammar
- addTokens("", caretOffset, resultSet, "lexer", "grammar");
+ //Empty grammar so far offer lexer, parser and grammar
+ addTokens("", caretOffset, resultSet, "lexer", "parser", "grammar");
}
}
- } catch (Throwable th) {
- System.out.println(th);
} finally {
resultSet.finish();
}
@@ -162,6 +146,9 @@ public class Antlr4CompletionProvider implements CompletionProvider {
if (t.isPresent() && t.get().getType() != LEXER) {
addTokens(prefix, caretOffset, resultSet, "lexer");
}
+ if (t.isPresent() && t.get().getType() != PARSER) {
+ addTokens(prefix, caretOffset, resultSet, "parser");
+ }
if (t.isPresent() && (t.get().getType() != LEXER) && (t.get().getType() != GRAMMAR)) {
addTokens(prefix, caretOffset, resultSet, "grammar");
}
@@ -174,11 +161,12 @@ public class Antlr4CompletionProvider implements CompletionProvider {
opt = tokens.previous(DEFAULT_CHANNEL);
}
if (!opt.isPresent()) {
- addTokens(prefix, caretOffset, resultSet, "lexer", "grammar");
+ addTokens(prefix, caretOffset, resultSet, "lexer", "parser", "grammar");
return;
} else {
pt = opt.get();
switch (pt.getType()) {
+ case PARSER:
case LEXER:
Optional<Token> t = tokens.next(DEFAULT_CHANNEL);
if (!t.isPresent() || t.get().getType() != GRAMMAR) {
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Formatter.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Formatter.java
new file mode 100644
index 0000000000..afc7d0e63e
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Formatter.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v4;
+
+import java.util.prefs.Preferences;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import org.antlr.parser.antlr4.ANTLRv4Lexer;
+import org.antlr.v4.runtime.CharStreams;
+import org.netbeans.modules.csl.api.Formatter;
+import org.netbeans.modules.csl.spi.ParserResult;
+import org.netbeans.modules.editor.indent.spi.Context;
+
+import static org.antlr.parser.antlr4.ANTLRv4Lexer.*;
+import org.antlr.v4.runtime.Token;
+import org.netbeans.api.editor.document.LineDocument;
+import org.netbeans.api.editor.document.LineDocumentUtils;
+import org.netbeans.api.editor.settings.SimpleValueNames;
+import org.netbeans.modules.editor.indent.spi.CodeStylePreferences;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class Antlr4Formatter implements Formatter {
+
+ public Antlr4Formatter() {
+ }
+
+ @Override
+ public void reformat(Context context, ParserResult compilationInfo) {
+ LineDocument doc = LineDocumentUtils.as(context.document(), LineDocument.class);
+ String text;
+ int indentSize = getIndentSize(context.document());
+ try {
+ text = doc.getText(0, doc.getLength());
+ } catch (BadLocationException ex) {
+ return;
+ }
+
+ ANTLRv4Lexer lexer = new ANTLRv4Lexer(CharStreams.fromString(text));
+ Token token = lexer.nextToken();
+ if (token.getType() == EOF) {
+ return;
+ }
+
+ final int cstart = context.startOffset();
+ final int cend = context.endOffset();
+
+ int tstart = token.getStartIndex();
+ int tstop = token.getStopIndex();
+
+ try {
+ boolean inRule = false;
+ int ruleLine = 0;
+ int parenDepth = 0;
+ int textDelta = 0;
+ int prevTokenType = -1;
+ while ((token.getType() != EOF) && (tstart < cend)) {
+ switch (token.getType()) {
+ case RULE_REF:
+ case TOKEN_REF:
+ // @header , @member, etc, are not real rules;
+ if (!inRule && (prevTokenType != AT)) {
+ inRule = true;
+ }
+ break;
+ case LPAREN:
+ parenDepth++;
+ break;
+ case RPAREN:
+ parenDepth--;
+ break;
+ case SEMI:
+ inRule = false;
+ break;
+ }
+ if (tstop >= cstart) {
+ if (!context.isIndent()) {
+ //TODO: Do non-indent formatting
+ }
+ if (token.getChannel() == OFF_CHANNEL) {
+ String ttext = token.getText();
+ int nl = ttext.indexOf('\n');
+ while ((nl != -1) && (tstart + nl <= cend)) {
+ int lineStart = context.lineStartOffset(tstart + textDelta + nl);
+ if (inRule || ruleLine > 0) {
+ if (tstart + nl >= cstart) {
+ // Indent the first rule line to 0 the rest to indentSize
+ int originalIndent = context.lineIndent(lineStart);
+ int newIndent = ruleLine > 0 ? indentSize : 0;
+ context.modifyIndent(lineStart, newIndent);
+ textDelta += newIndent - originalIndent;
+ }
+ ruleLine = inRule ? ruleLine + 1 : 0;
+ }
+ nl = ttext.indexOf('\n', nl + 1);
+ }
+ }
+ }
+ prevTokenType = token.getType();
+ token = lexer.nextToken();
+ tstart = token.getStartIndex();
+ tstop = token.getStopIndex();
+ }
+ } catch (BadLocationException ex) {}
+ }
+
+ @Override
+ public void reindent(Context context) {
+ reformat(context, null);
+ }
+
+ @Override
+ public boolean needsParserResult() {
+ return false;
+ }
+
+ @Override
+ public int indentSize() {
+ return 4;
+ }
+
+ @Override
+ public int hangingIndentSize() {
+ return 4;
+ }
+
+ static int getIndentSize(Document doc) {
+ Preferences prefs = CodeStylePreferences.get(doc).getPreferences();
+ return prefs.getInt(SimpleValueNames.INDENT_SHIFT_WIDTH, 4);
+ }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java
index d411060999..88fa824a6a 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java
@@ -23,6 +23,7 @@ import org.netbeans.api.lexer.Language;
import org.netbeans.core.spi.multiview.MultiViewElement;
import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
import org.netbeans.modules.csl.api.DeclarationFinder;
+import org.netbeans.modules.csl.api.Formatter;
import org.netbeans.modules.csl.api.OccurrencesFinder;
import org.netbeans.modules.csl.api.StructureScanner;
import org.netbeans.modules.csl.spi.DefaultLanguageConfig;
@@ -131,6 +132,16 @@ public final class Antlr4Language extends DefaultLanguageConfig {
return Bundle.ANTLRv4Resolver();
}
+ @Override
+ public Formatter getFormatter() {
+ return new Antlr4Formatter();
+ }
+
+ @Override
+ public boolean hasFormatter() {
+ return true;
+ }
+
@Override
public String getPreferredExtension() {
return "g4";
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
index b6823cc56c..e586a69ef2 100644
--- a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
@@ -31,6 +31,7 @@ import org.antlr.parser.antlr4.ANTLRv4ParserBaseListener;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.ConsoleErrorListener;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.antlr.v4.runtime.tree.TerminalNode;
@@ -64,7 +65,9 @@ public final class Antlr4ParserResult extends AntlrParserResult<ANTLRv4Parser> {
CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText()));
ANTLRv4Lexer lexer = new org.antlr.parser.antlr4.ANTLRv4Lexer(cs);
CommonTokenStream tokens = new CommonTokenStream(lexer);
- return new ANTLRv4Parser(tokens);
+ ANTLRv4Parser ret = new ANTLRv4Parser(tokens);
+ ret.removeErrorListener(ConsoleErrorListener.INSTANCE);
+ return ret;
}
@Override
@@ -82,14 +85,18 @@ public final class Antlr4ParserResult extends AntlrParserResult<ANTLRv4Parser> {
return new ANTLRv4ParserBaseListener() {
@Override
public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) {
- Token token = ctx.RULE_REF().getSymbol();
- addReference(token);
+ if (ctx.RULE_REF() != null) {
+ Token token = ctx.RULE_REF().getSymbol();
+ addReference(token);
+ }
}
@Override
public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) {
- Token token = ctx.TOKEN_REF().getSymbol();
- addReference(token);
+ if (ctx.TOKEN_REF() != null) {
+ Token token = ctx.TOKEN_REF().getSymbol();
+ addReference(token);
+ }
}
@Override
@@ -112,7 +119,9 @@ public final class Antlr4ParserResult extends AntlrParserResult<ANTLRv4Parser> {
@Override
public void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx) {
- addReference(getIdentifierToken(ctx.identifier()));
+ if (ctx.identifier() != null) {
+ addReference(getIdentifierToken(ctx.identifier()));
+ }
}
public void addReference(Token token) {
@@ -311,7 +320,9 @@ public final class Antlr4ParserResult extends AntlrParserResult<ANTLRv4Parser> {
@Override
public void exitLexerCommandExpr(ANTLRv4Parser.LexerCommandExprContext ctx) {
- onOccurance.accept(getIdentifierToken(ctx.identifier()));
+ if (ctx.identifier() != null) {
+ onOccurance.accept(getIdentifierToken(ctx.identifier()));
+ }
}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/preferences.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/preferences.xml
new file mode 100644
index 0000000000..29d9676ecb
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/preferences.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE editor-preferences PUBLIC "-//NetBeans//DTD Editor Preferences 1.0//EN" "http://www.netbeans.org/dtds/EditorPreferences-1_0.dtd">
+
+<editor-preferences>
+ <entry category="private" name="custom-action-list" value="org.netbeans.modules.languages.yaml.InsertTabAction.createCustomActions" />
+ <entry javaType="java.lang.Boolean" name="enable-indent" xml:space="preserve"><value>true</value></entry>
+ <entry javaType="java.lang.Integer" name="indent-shift-width" xml:space="preserve"><value>4</value></entry>
+</editor-preferences>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/snippets.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/snippets.xml
new file mode 100644
index 0000000000..8f8435dd13
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/snippets.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<!DOCTYPE codetemplates PUBLIC "-//NetBeans//DTD Editor Code Templates settings 1.0//EN" "https://netbeans.apache.org/dtds/EditorCodeTemplates-1_0.dtd">
+<codetemplates>
+ <codetemplate abbreviation="ch" xml:space="preserve">
+ <code>-> channel (${cursor})</code>
+ </codetemplate>
+ <codetemplate abbreviation="fr" xml:space="preserve">
+ <code>fragment </code>
+ </codetemplate>
+ <codetemplate abbreviation="gr" xml:space="preserve">
+ <code>grammar </code>
+ </codetemplate>
+ <codetemplate abbreviation="lx" xml:space="preserve">
+ <code>lexer </code>
+ </codetemplate>
+ <codetemplate abbreviation="md" xml:space="preserve">
+ <code>mode </code>
+ </codetemplate>
+ <codetemplate abbreviation="pa" xml:space="preserve">
+ <code>parser </code>
+ </codetemplate>
+ <codetemplate abbreviation="pom" xml:space="preserve">
+ <code>-> popMode</code>
+ </codetemplate>
+ <codetemplate abbreviation="pum" xml:space="preserve">
+ <code>-> pushMode (${cursor})</code>
+ </codetemplate>
+ <codetemplate abbreviation="sk" xml:space="preserve">
+ <code>-> skip</code>
+ </codetemplate>
+ <codetemplate abbreviation="tp" xml:space="preserve">
+ <code>-> type (${cursor})</code>
+ </codetemplate>
+</codetemplates>
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists