Added Cpp/C highlighting

This commit is contained in:
MrIkso
2022-05-29 16:17:49 +03:00
parent 6c3b7bc387
commit 3c67341b8d
11 changed files with 18705 additions and 334 deletions
@@ -0,0 +1,248 @@
package com.itsaky.androidide.language.cpp;
import static com.itsaky.androidide.lexers.cpp.CPP14Lexer.*;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.LITERAL;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.OPERATOR;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.TEXT_NORMAL;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.TYPE_NAME;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.forComment;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.forKeyword;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.forString;
import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.get;
import com.itsaky.androidide.lexers.cpp.CPP14Lexer;
import com.itsaky.androidide.lexers.cpp.CPP14Parser;
import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE;
import com.itsaky.androidide.utils.CharSequenceReader;
import com.itsaky.androidide.utils.ILogger;
import io.github.rosemoe.sora.lang.analysis.SimpleAnalyzeManager;
import io.github.rosemoe.sora.lang.styling.CodeBlock;
import io.github.rosemoe.sora.lang.styling.MappedSpans;
import io.github.rosemoe.sora.lang.styling.Styles;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CodePointCharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Token;
import java.io.IOException;
import java.util.Stack;
public class CppAnalyzer extends SimpleAnalyzeManager<Void> {
private static final ILogger LOG = ILogger.newInstance("CppAnalyzer");
@Override
protected Styles analyze(StringBuilder text, Delegate<Void> delegate) {
final var styles = new Styles();
final var colors = new MappedSpans.Builder();
final CodePointCharStream stream;
try {
stream = CharStreams.fromReader(new CharSequenceReader(text));
} catch (IOException e) {
LOG.error("Unable to read text to analyze", e);
return styles;
}
final var lexer = new CPP14Lexer(stream);
// final var parser = new CPP14Parser(new CommonTokenStream(lexer));
final var stack = new Stack<CodeBlock>();
Token token;
int line, column, lastLine = 1, currSwitch = 0, maxSwitch = 0, type, previous = 0;
boolean isFirst = true;
while (!delegate.isCancelled()) {
token = lexer.nextToken();
if (token == null) {
break;
}
line = token.getLine() - 1;
column = token.getCharPositionInLine();
type = token.getType();
if (type == CPP14Lexer.EOF) {
lastLine = line;
break;
}
switch (type) {
case Whitespace:
if (isFirst) {
colors.addNormalIfNull();
}
break;
case Alignas:
case Alignof:
case Asm:
case Auto:
case Break:
case Class:
case Const:
case Catch:
case Case:
case Constexpr:
case Const_cast:
case Continue:
case Decltype:
case Default:
case Delete:
case Do:
case Dynamic_cast:
case Else:
case Enum:
case Explicit:
case Export:
case Extern:
case Final:
case For:
case Friend:
case Goto:
case If:
case Inline:
case Mutable:
case Namespace:
case New:
case Noexcept:
case Operator:
case Override:
case Private:
case Protected:
case Public:
case Register:
case Reinterpret_cast:
case Return:
case Sizeof:
case Signed:
case Static:
case Static_cast:
case Static_assert:
case Struct:
case Switch:
case Template:
case This:
case Throw:
case Thread_local:
case Try:
case Typedef:
case Typeid_:
case Typename_:
case Unsigned:
case Union:
case Using:
case Virtual:
case Volatile:
case While:
case Void:
colors.addIfNeeded(line, column, forKeyword());
break;
case Bool:
case Char:
case Char16:
case Char32:
case Double:
case Float:
case Int:
case Long:
case Short:
case Wchar:
colors.addIfNeeded(line, column, get(TYPE_NAME));
break;
case LeftParen:
case LeftBracket:
case LeftBrace:
case Dot:
case RightParen:
case RightBracket:
case RightBrace:
case Semi:
case Comma:
colors.addIfNeeded(line, column, get(OPERATOR));
break;
case Plus:
case Minus:
case Star:
case Div:
case Mod:
case Caret:
case And:
case Or:
case Tilde:
case Not:
case Assign:
case Less:
case Greater:
case PlusAssign:
case MinusAssign:
case StarAssign:
case DivAssign:
case ModAssign:
case XorAssign:
case AndAssign:
case OrAssign:
case RightShiftAssign:
case LeftShiftAssign:
case Equal:
case NotEqual:
case LessEqual:
case GreaterEqual:
case AndAnd:
case OrOr:
case PlusPlus:
case MinusMinus:
case Arrow:
case ArrowStar:
case Question:
case Colon:
case Doublecolon:
case DotStar:
case Ellipsis:
colors.addIfNeeded(line, column, get(OPERATOR));
break;
case IntegerLiteral:
case DecimalLiteral:
case OctalLiteral:
case HexadecimalLiteral:
case BinaryLiteral:
case Integersuffix:
case CharacterLiteral:
case FloatingLiteral:
case StringLiteral:
case BooleanLiteral:
case Nullptr:
case True_:
case False_:
colors.addIfNeeded(line, column, get(LITERAL));
break;
case BlockComment:
case LineComment:
colors.addIfNeeded(line, column, get(SchemeAndroidIDE.COMMENT));
break;
case MultiLineMacro:
case Directive:
colors.addIfNeeded(line, column, forString());
break;
default:
colors.addIfNeeded(line, column, get(TEXT_NORMAL));
break;
}
isFirst = false;
if (type != Whitespace) {
previous = type;
}
}
if (stack.isEmpty() && currSwitch > maxSwitch) {
maxSwitch = currSwitch;
}
colors.determine(lastLine);
styles.setSuppressSwitch(maxSwitch + 10);
styles.spans = colors.build();
return styles;
}
}
@@ -0,0 +1,167 @@
/************************************************************************************
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* AndroidIDE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
*
**************************************************************************************/
package com.itsaky.androidide.language.cpp;
import android.os.Bundle;
import androidx.annotation.NonNull;
import com.itsaky.androidide.language.IDELanguage;
import com.itsaky.androidide.language.java.JavaLanguage;
import com.itsaky.androidide.utils.CharSequenceReader;
import com.itsaky.androidide.utils.ILogger;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.Token;
import java.io.StringReader;
import com.itsaky.androidide.lexers.cpp.CPP14Lexer;
import io.github.rosemoe.sora.lang.analysis.AnalyzeManager;
import io.github.rosemoe.sora.lang.completion.CompletionCancelledException;
import io.github.rosemoe.sora.lang.completion.CompletionPublisher;
import io.github.rosemoe.sora.lang.smartEnter.NewlineHandleResult;
import io.github.rosemoe.sora.lang.smartEnter.NewlineHandler;
import io.github.rosemoe.sora.text.CharPosition;
import io.github.rosemoe.sora.text.ContentReference;
import io.github.rosemoe.sora.text.TextUtils;
import io.github.rosemoe.sora.widget.SymbolPairMatch;
public class CppLanguage extends IDELanguage {
private static final ILogger LOG = ILogger.newInstance("CppLanguage");
private CppAnalyzer analyzer;
private final NewlineHandler[] newlineHandlers = new NewlineHandler[] {new BraceHandler()};
public CppLanguage() {
analyzer = new CppAnalyzer();
}
@Override
public int getIndentAdvance(@NonNull String line) {
try {
CPP14Lexer lexer = new CPP14Lexer(CharStreams.fromReader(new StringReader(line)));
Token token;
int advance = 0;
while (((token = lexer.nextToken()) != null && token.getType() != token.EOF)) {
switch (token.getType()) {
case CPP14Lexer.LeftBrace:
advance++;
break;
case CPP14Lexer.RightBrace:
advance--;
break;
}
}
advance = Math.max(0, advance);
return advance * getTabSize();
} catch (Throwable e) {
LOG.error("Error calculating indent advance", e);
}
return 0;
}
@Override
public SymbolPairMatch getSymbolPairs() {
return new CppSymbolPairs();
}
@NonNull
@Override
public AnalyzeManager getAnalyzeManager() {
return analyzer;
}
@Override
public int getInterruptionLevel() {
return INTERRUPTION_LEVEL_STRONG;
}
@Override
public void requireAutoComplete(
@NonNull ContentReference content,
@NonNull CharPosition position,
@NonNull CompletionPublisher publisher,
@NonNull Bundle extraArguments)
throws CompletionCancelledException {
// completer.complete(content, position, publisher, extraArguments);
}
@Override
public int getIndentAdvance(@NonNull ContentReference content, int line, int column) {
return getIndentAdvance(content.getLine(line).substring(0, column));
}
@Override
public CharSequence format(CharSequence content) {
return content;
}
@Override
public NewlineHandler[] getNewlineHandlers() {
return newlineHandlers;
}
@Override
public void destroy() {
analyzer = null;
}
private static class CppSymbolPairs extends SymbolPairMatch {
public CppSymbolPairs() {
super.putPair('{', new Replacement("{}", 1));
super.putPair('(', new Replacement("()", 1));
super.putPair('[', new Replacement("[]", 1));
super.putPair('"', new Replacement("\"\"", 1));
super.putPair('\'', new Replacement("''", 1));
super.putPair('<', new Replacement("<>", 1));
}
}
class BraceHandler implements NewlineHandler {
@Override
public boolean matchesRequirement(String beforeText, String afterText) {
beforeText = beforeText.trim();
afterText = afterText.trim();
return beforeText.endsWith("{") && afterText.startsWith("}");
}
@Override
public NewlineHandleResult handleNewline(String beforeText, String afterText, int tabSize) {
int count = TextUtils.countLeadingSpaceCount(beforeText, tabSize);
int advanceBefore = getIndentAdvance(beforeText);
int advanceAfter = getIndentAdvance(afterText);
String text;
StringBuilder sb =
new StringBuilder("\n")
.append(
TextUtils.createIndent(
count + advanceBefore, tabSize, useTab()))
.append('\n')
.append(
text =
TextUtils.createIndent(
count + advanceAfter, tabSize, useTab()));
int shiftLeft = text.length() + 1;
return new NewlineHandleResult(sb, shiftLeft);
}
}
}
@@ -44,10 +44,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.SizeUtils;
import com.itsaky.androidide.adapters.CompletionListAdapter;
import com.itsaky.androidide.app.StudioApp;
import com.itsaky.androidide.databinding.LayoutCodeEditorBinding;
import com.itsaky.androidide.language.cpp.CppLanguage;
import com.itsaky.androidide.language.groovy.GroovyLanguage;
import com.itsaky.androidide.language.java.JavaLanguage;
import com.itsaky.androidide.language.xml.XMLLanguage;
@@ -61,8 +63,10 @@ import com.itsaky.androidide.utils.ILogger;
import com.itsaky.androidide.utils.LSPUtils;
import com.itsaky.androidide.utils.TypefaceUtils;
import com.itsaky.inflater.values.ValuesTableFactory;
import com.itsaky.lsp.api.ILanguageServer;
import com.itsaky.lsp.models.Range;
import io.github.rosemoe.sora.lang.Language;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.Token;
@@ -87,357 +91,386 @@ import io.github.rosemoe.sora.widget.component.Magnifier;
@SuppressLint("ViewConstructor") // This view is always dynamically created.
public class CodeEditorView extends FrameLayout {
private static final ILogger LOG = ILogger.newInstance("CodeEditorView");
private final File file;
private final LayoutCodeEditorBinding binding;
private boolean isModified;
private boolean isFirstCreate;
private static final ILogger LOG = ILogger.newInstance("CodeEditorView");
private final File file;
private final LayoutCodeEditorBinding binding;
private boolean isModified;
private boolean isFirstCreate;
public CodeEditorView(
@NonNull Context context, @NonNull File file, final @NonNull Range selection) {
super(context);
this.file = file;
this.isModified = false;
this.isFirstCreate = true;
public CodeEditorView(
@NonNull Context context, @NonNull File file, final @NonNull Range selection) {
super(context);
this.file = file;
this.isModified = false;
this.isFirstCreate = true;
this.binding = LayoutCodeEditorBinding.inflate(LayoutInflater.from(context));
this.binding.editor.setTypefaceText(TypefaceUtils.jetbrainsMono());
this.binding.editor.setHighlightCurrentBlock(true);
this.binding.editor.getProps().autoCompletionOnComposing = true;
this.binding.editor.setAutoCompletionItemAdapter(new CompletionListAdapter());
this.binding.editor.setDividerWidth(SizeUtils.dp2px(1));
this.binding.editor.setColorScheme(new SchemeAndroidIDE());
this.binding.editor.subscribeEvent(
ContentChangeEvent.class, ((event, unsubscribe) -> handleContentChange(event)));
this.binding = LayoutCodeEditorBinding.inflate(LayoutInflater.from(context));
this.binding.editor.setTypefaceText(TypefaceUtils.jetbrainsMono());
this.binding.editor.setHighlightCurrentBlock(true);
this.binding.editor.getProps().autoCompletionOnComposing = true;
this.binding.editor.setAutoCompletionItemAdapter(new CompletionListAdapter());
this.binding.editor.setDividerWidth(SizeUtils.dp2px(1));
this.binding.editor.setColorScheme(new SchemeAndroidIDE());
this.binding.editor.subscribeEvent(
ContentChangeEvent.class, ((event, unsubscribe) -> handleContentChange(event)));
this.binding.diagnosticTextContainer.setVisibility(GONE);
this.binding.diagnosticTextContainer.setVisibility(GONE);
removeAllViews();
addView(this.binding.getRoot());
removeAllViews();
addView(this.binding.getRoot());
selection.validate();
CompletableFuture.runAsync(
() -> {
final var contents = FileIOUtils.readFile2String(file);
binding.editor.post(
() -> {
binding.editor.setText(contents, createEditorArgs());
postRead();
if (LSPUtils.isEqual(selection.getStart(), selection.getEnd())) {
getEditor()
.setSelection(
selection.getStart().getLine(), selection.getStart().getColumn());
} else {
getEditor().setSelection(selection);
selection.validate();
CompletableFuture.runAsync(
() -> {
final var contents = FileIOUtils.readFile2String(file);
binding.editor.post(
() -> {
binding.editor.setText(contents, createEditorArgs());
postRead();
if (LSPUtils.isEqual(selection.getStart(), selection.getEnd())) {
getEditor()
.setSelection(
selection.getStart().getLine(),
selection.getStart().getColumn());
} else {
getEditor().setSelection(selection);
}
});
});
configureEditorIfNeeded();
}
@NonNull
private Bundle createEditorArgs() {
var bundle = new Bundle();
if (getFile() == null) {
return bundle;
}
bundle.putString(IDEEditor.KEY_FILE, getFile().getAbsolutePath());
return bundle;
}
private void handleContentChange(@NonNull ContentChangeEvent event) {
isModified = true;
if (event.getAction() == ContentChangeEvent.ACTION_INSERT) {
final var editor = event.getEditor();
final var content = event.getChangedText();
final var endLine = event.getChangeEnd().line;
final var endColumn = event.getChangeEnd().column;
if (file.getName().endsWith(".xml")) {
boolean isOpen = false;
try {
isOpen = editor.getText().charAt(editor.getCursor().getLeft() - 2) == '<';
} catch (Throwable th) {
LOG.error(th);
}
});
});
configureEditorIfNeeded();
}
@NonNull
private Bundle createEditorArgs() {
var bundle = new Bundle();
if (getFile() == null) {
return bundle;
if (isOpen && "/".contentEquals(content)) {
closeCurrentTag(editor.getText().toString(), endLine, endColumn);
}
}
}
}
bundle.putString(IDEEditor.KEY_FILE, getFile().getAbsolutePath());
return bundle;
}
public boolean save() {
final var file = getFile();
if (file == null) {
LOG.error("Cannot save file. File instance is null.");
return false;
}
private void handleContentChange(@NonNull ContentChangeEvent event) {
isModified = true;
if (!isModified() && file.exists()) {
LOG.info(file.getName());
LOG.info("File was not modified. Skipping save operation.");
return false;
}
final var text = getEditor().getText().toString();
if (event.getAction() == ContentChangeEvent.ACTION_INSERT) {
final var editor = event.getEditor();
final var content = event.getChangedText();
final var endLine = event.getChangeEnd().line;
final var endColumn = event.getChangeEnd().column;
if (file.getName().endsWith(".xml")) {
boolean isOpen = false;
try {
isOpen = editor.getText().charAt(editor.getCursor().getLeft() - 2) == '<';
FileUtil.writeFile(file, text);
notifySaved();
isModified = false;
return true;
} catch (IOException io) {
LOG.error("Failed to save file", file, io);
return false;
}
}
@NonNull
private List<CharSequence> getLines(Content text) {
final var count = text.getLineCount();
final var result = new ArrayList<CharSequence>();
for (int i = 0; i < count; i++) {
result.add(text.getLine(i));
}
return result;
}
public IDEEditor getEditor() {
return binding.editor;
}
public LayoutCodeEditorBinding getBinding() {
return binding;
}
@Nullable
public File getFile() {
return file;
}
public String getText() {
return binding.editor.getText().toString();
}
public boolean isModified() {
return isModified;
}
public void onPause() {
// unimplemented
}
public void onResume() {
configureEditorIfNeeded();
}
public void onEditorSelected() {
final var editor = getEditor();
if (editor != null) {
editor.onEditorSelected();
}
}
public void undo() {
if (binding.editor.canUndo()) {
binding.editor.undo();
}
}
public void redo() {
if (binding.editor.canRedo()) {
binding.editor.redo();
}
}
public void findDefinition() {
binding.editor.findDefinition();
}
public void findReferences() {
binding.editor.findReferences();
}
public void commentLine() {
binding.editor.commentLine();
}
public void uncommentLine() {
binding.editor.uncommentLine();
}
public void beginSearch() {
binding.editor.beginSearchMode();
}
protected void postRead() {
binding.editor.setEditorLanguage(createLanguage(file));
binding.editor.setLanguageServer(createLanguageServer(file));
// File must be set only after setting the language server
// This will make sure that textDocument/didOpen is sent
binding.editor.setFile(getFile());
if (getContext() instanceof Activity) {
((Activity) getContext()).invalidateOptionsMenu();
}
}
private ILanguageServer createLanguageServer(File file) {
if (file.isFile()) {
String ext = FileUtils.getFileExtension(file);
switch (ext) {
case "java":
return StudioApp.getInstance().getJavaLanguageServer();
case "xml":
return StudioApp.getInstance().getXMLLanguageServer();
default:
return null;
}
}
return null;
}
private Language createLanguage(File file) {
if (file.isFile()) {
String ext = FileUtils.getFileExtension(file);
switch (ext) {
case "java":
return new JavaLanguage();
case "xml":
return new XMLLanguage();
case "gradle":
return new GroovyLanguage();
case "kt":
return new KotlinLanguage();
case "c":
case "h":
case "cc":
case "cpp":
case "cxx":
return new CppLanguage();
default:
return new EmptyLanguage();
}
}
return new EmptyLanguage();
}
private void configureEditorIfNeeded() {
boolean sizeChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_SIZE_CHANGED;
boolean ligaturesChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED;
boolean flagsChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED;
boolean drawHexChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED;
boolean inputFlagsChanged =
isFirstCreate || ConstantsBridge.EDITOR_PREF_VISIBLE_PASSWORD_CHANGED;
boolean wordWrapChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_WORD_WRAP_CHANGED;
boolean magnifierChanged =
isFirstCreate || ConstantsBridge.EDITOR_PREF_USE_MAGNIFIER_CHANGED;
final PreferenceManager prefs = StudioApp.getInstance().getPrefManager();
if (sizeChanged) {
float textSize = prefs.getFloat(PreferenceManager.KEY_EDITOR_FONT_SIZE);
if (textSize < 6 || textSize > 32) {
textSize = 14;
}
binding.editor.setTextSize(textSize);
ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = false;
}
if (ligaturesChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_FONT_LIGATURES, true);
binding.editor.setLigatureEnabled(enabled);
ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED = false;
}
if (flagsChanged) {
int flags = 0;
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_LEADING, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_LEADING;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_TRAILING, false)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_TRAILING;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_INNER, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_INNER;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_EMPTY_LINE, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_FOR_EMPTY_LINE;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_LINE_BREAK, true)) {
flags |= IDEEditor.FLAG_DRAW_LINE_SEPARATOR;
}
binding.editor.setNonPrintablePaintingFlags(flags);
ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = false;
}
if (inputFlagsChanged) {
binding.editor.setInputType(IDEEditor.createInputFlags());
ConstantsBridge.EDITOR_PREF_VISIBLE_PASSWORD_CHANGED = false;
}
if (drawHexChanged) {
// TODO Do something about this
// Maybe use spans...
// binding.editor.setLineColorsEnabled (prefs.getBoolean
// (PreferenceManager.KEY_EDITOR_DRAW_HEX, true));
ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = false;
}
if (wordWrapChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_WORD_WRAP, false);
binding.editor.setWordwrap(enabled);
ConstantsBridge.EDITOR_PREF_WORD_WRAP_CHANGED = false;
}
if (magnifierChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_USE_MAGNIFER, true);
binding.editor.getComponent(Magnifier.class).setEnabled(enabled);
ConstantsBridge.EDITOR_PREF_USE_MAGNIFIER_CHANGED = false;
}
isFirstCreate = false;
}
private void closeCurrentTag(String text, int line, int col) {
try {
XMLLexer lexer = new XMLLexer(CharStreams.fromReader(new StringReader(text)));
Token token;
boolean wasSlash = false, wasOpen = false;
ArrayList<String> currentNames = new ArrayList<>();
while (((token = lexer.nextToken()) != null && token.getType() != token.EOF)) {
final int type = token.getType();
if (type == XMLLexer.OPEN) {
wasOpen = true;
} else if (type == XMLLexer.Name) {
if (wasOpen && wasSlash && currentNames.size() > 0) {
currentNames.remove(0);
} else if (wasOpen) {
currentNames.add(0, token.getText());
wasOpen = false;
}
} else if (type == XMLLexer.OPEN_SLASH) {
int l = token.getLine() - 1;
int c = token.getCharPositionInLine();
if (l == line && c == col) {
break;
} else if (currentNames.size() > 0) {
currentNames.remove(0);
}
} else if (type == XMLLexer.SLASH_CLOSE || type == XMLLexer.SPECIAL_CLOSE) {
if (currentNames.size() > 0 && token.getText().trim().endsWith("/>")) {
currentNames.remove(0);
}
} else if (type == XMLLexer.SLASH) {
wasSlash = true;
} else {
wasOpen = wasSlash = false;
}
}
if (currentNames.size() > 0) {
binding.editor.getText().insert(line, col + 2, currentNames.get(0));
}
} catch (Throwable th) {
LOG.error(th);
LOG.error("Unable to close current tag", th);
}
}
if (isOpen && "/".contentEquals(content)) {
closeCurrentTag(editor.getText().toString(), endLine, endColumn);
private void notifySaved() {
binding.editor.didSave();
if (Objects.requireNonNull(getFile()).getName().endsWith(".xml")) {
ValuesTableFactory.syncWithFile(getFile());
}
}
}
}
public boolean save() {
final var file = getFile();
if (file == null) {
LOG.error("Cannot save file. File instance is null.");
return false;
}
if (!isModified() && file.exists()) {
LOG.info(file.getName());
LOG.info("File was not modified. Skipping save operation.");
return false;
/** Mark this files as saved. Even if it not saved. */
public void markAsSaved() {
isModified = false;
notifySaved();
}
final var text = getEditor().getText().toString();
try {
FileUtil.writeFile(file, text);
notifySaved();
isModified = false;
return true;
} catch (IOException io) {
LOG.error("Failed to save file", file, io);
return false;
}
}
@NonNull
private List<CharSequence> getLines(Content text) {
final var count = text.getLineCount();
final var result = new ArrayList<CharSequence>();
for (int i = 0; i < count; i++) {
result.add(text.getLine(i));
}
return result;
}
public IDEEditor getEditor() {
return binding.editor;
}
public LayoutCodeEditorBinding getBinding() {
return binding;
}
@Nullable
public File getFile() {
return file;
}
public String getText() {
return binding.editor.getText().toString();
}
public boolean isModified() {
return isModified;
}
public void onPause() {
// unimplemented
}
public void onResume() {
configureEditorIfNeeded();
}
public void onEditorSelected() {
final var editor = getEditor();
if (editor != null) {
editor.onEditorSelected();
}
}
public void undo() {
if (binding.editor.canUndo()) {
binding.editor.undo();
}
}
public void redo() {
if (binding.editor.canRedo()) {
binding.editor.redo();
}
}
public void findDefinition() {
binding.editor.findDefinition();
}
public void findReferences() {
binding.editor.findReferences();
}
public void commentLine() {
binding.editor.commentLine();
}
public void uncommentLine() {
binding.editor.uncommentLine();
}
public void beginSearch() {
binding.editor.beginSearchMode();
}
protected void postRead() {
if (file.isFile() && file.getName().endsWith(".java")) {
binding.editor.setEditorLanguage(new JavaLanguage());
binding.editor.setLanguageServer(StudioApp.getInstance().getJavaLanguageServer());
} else if (file.isFile() && file.getName().endsWith(".xml")) {
binding.editor.setEditorLanguage(new XMLLanguage());
binding.editor.setLanguageServer(StudioApp.getInstance().getXMLLanguageServer());
} else if (file.isFile() && file.getName().endsWith(".gradle")) {
binding.editor.setEditorLanguage(new GroovyLanguage());
} else if (file.isFile() && file.getName().endsWith(".kt")) {
binding.editor.setEditorLanguage(new KotlinLanguage());
}
else {
binding.editor.setEditorLanguage(new EmptyLanguage());
}
// File must be set only after setting the language server
// This will make sure that textDocument/didOpen is sent
binding.editor.setFile(getFile());
if (getContext() instanceof Activity) {
((Activity) getContext()).invalidateOptionsMenu();
}
}
private void configureEditorIfNeeded() {
boolean sizeChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_SIZE_CHANGED;
boolean ligaturesChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED;
boolean flagsChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED;
boolean drawHexChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED;
boolean inputFlagsChanged =
isFirstCreate || ConstantsBridge.EDITOR_PREF_VISIBLE_PASSWORD_CHANGED;
boolean wordWrapChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_WORD_WRAP_CHANGED;
boolean magnifierChanged = isFirstCreate || ConstantsBridge.EDITOR_PREF_USE_MAGNIFIER_CHANGED;
final PreferenceManager prefs = StudioApp.getInstance().getPrefManager();
if (sizeChanged) {
float textSize = prefs.getFloat(PreferenceManager.KEY_EDITOR_FONT_SIZE);
if (textSize < 6 || textSize > 32) {
textSize = 14;
}
binding.editor.setTextSize(textSize);
ConstantsBridge.EDITOR_PREF_SIZE_CHANGED = false;
}
if (ligaturesChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_FONT_LIGATURES, true);
binding.editor.setLigatureEnabled(enabled);
ConstantsBridge.EDITOR_PREF_LIGATURES_CHANGED = false;
}
if (flagsChanged) {
int flags = 0;
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_LEADING, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_LEADING;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_TRAILING, false)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_TRAILING;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_INNER, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_INNER;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_WS_EMPTY_LINE, true)) {
flags |= IDEEditor.FLAG_DRAW_WHITESPACE_FOR_EMPTY_LINE;
}
if (prefs.getBoolean(PreferenceManager.KEY_EDITOR_FLAG_LINE_BREAK, true)) {
flags |= IDEEditor.FLAG_DRAW_LINE_SEPARATOR;
}
binding.editor.setNonPrintablePaintingFlags(flags);
ConstantsBridge.EDITOR_PREF_FLAGS_CHANGED = false;
}
if (inputFlagsChanged) {
binding.editor.setInputType(IDEEditor.createInputFlags());
ConstantsBridge.EDITOR_PREF_VISIBLE_PASSWORD_CHANGED = false;
}
if (drawHexChanged) {
// TODO Do something about this
// Maybe use spans...
// binding.editor.setLineColorsEnabled (prefs.getBoolean
// (PreferenceManager.KEY_EDITOR_DRAW_HEX, true));
ConstantsBridge.EDITOR_PREF_DRAW_HEX_CHANGED = false;
}
if (wordWrapChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_WORD_WRAP, false);
binding.editor.setWordwrap(enabled);
ConstantsBridge.EDITOR_PREF_WORD_WRAP_CHANGED = false;
}
if (magnifierChanged) {
var enabled = prefs.getBoolean(PreferenceManager.KEY_EDITOR_USE_MAGNIFER, true);
binding.editor.getComponent(Magnifier.class).setEnabled(enabled);
ConstantsBridge.EDITOR_PREF_USE_MAGNIFIER_CHANGED = false;
}
isFirstCreate = false;
}
private void closeCurrentTag(String text, int line, int col) {
try {
XMLLexer lexer = new XMLLexer(CharStreams.fromReader(new StringReader(text)));
Token token;
boolean wasSlash = false, wasOpen = false;
ArrayList<String> currentNames = new ArrayList<>();
while (((token = lexer.nextToken()) != null && token.getType() != token.EOF)) {
final int type = token.getType();
if (type == XMLLexer.OPEN) {
wasOpen = true;
} else if (type == XMLLexer.Name) {
if (wasOpen && wasSlash && currentNames.size() > 0) {
currentNames.remove(0);
} else if (wasOpen) {
currentNames.add(0, token.getText());
wasOpen = false;
}
} else if (type == XMLLexer.OPEN_SLASH) {
int l = token.getLine() - 1;
int c = token.getCharPositionInLine();
if (l == line && c == col) {
break;
} else if (currentNames.size() > 0) {
currentNames.remove(0);
}
} else if (type == XMLLexer.SLASH_CLOSE || type == XMLLexer.SPECIAL_CLOSE) {
if (currentNames.size() > 0 && token.getText().trim().endsWith("/>")) {
currentNames.remove(0);
}
} else if (type == XMLLexer.SLASH) {
wasSlash = true;
} else {
wasOpen = wasSlash = false;
}
}
if (currentNames.size() > 0) {
binding.editor.getText().insert(line, col + 2, currentNames.get(0));
}
} catch (Throwable th) {
LOG.error("Unable to close current tag", th);
}
}
private void notifySaved() {
binding.editor.didSave();
if (Objects.requireNonNull(getFile()).getName().endsWith(".xml")) {
ValuesTableFactory.syncWithFile(getFile());
}
}
/** Mark this files as saved. Even if it not saved. */
public void markAsSaved() {
isModified = false;
notifySaved();
}
}
@@ -0,0 +1,409 @@
lexer grammar CPP14Lexer;
IntegerLiteral:
DecimalLiteral Integersuffix?
| OctalLiteral Integersuffix?
| HexadecimalLiteral Integersuffix?
| BinaryLiteral Integersuffix?;
CharacterLiteral:
('u' | 'U' | 'L')? '\'' Cchar+ '\'';
FloatingLiteral:
Fractionalconstant Exponentpart? Floatingsuffix?
| Digitsequence Exponentpart Floatingsuffix?;
StringLiteral:
Encodingprefix?
(Rawstring
|'"' Schar* '"');
BooleanLiteral: False_ | True_;
PointerLiteral: Nullptr;
UserDefinedLiteral:
UserDefinedIntegerLiteral
| UserDefinedFloatingLiteral
| UserDefinedStringLiteral
| UserDefinedCharacterLiteral;
MultiLineMacro:
'#' (~[\n]*? '\\' '\r'? '\n')+ ~ [\n]+ -> channel (HIDDEN);
Directive: '#' ~ [\n]* -> channel (HIDDEN);
/*Keywords*/
Alignas: 'alignas';
Alignof: 'alignof';
Asm: 'asm';
Auto: 'auto';
Bool: 'bool';
Break: 'break';
Case: 'case';
Catch: 'catch';
Char: 'char';
Char16: 'char16_t';
Char32: 'char32_t';
Class: 'class';
Const: 'const';
Constexpr: 'constexpr';
Const_cast: 'const_cast';
Continue: 'continue';
Decltype: 'decltype';
Default: 'default';
Delete: 'delete';
Do: 'do';
Double: 'double';
Dynamic_cast: 'dynamic_cast';
Else: 'else';
Enum: 'enum';
Explicit: 'explicit';
Export: 'export';
Extern: 'extern';
//DO NOT RENAME - PYTHON NEEDS True and False
False_: 'false';
Final: 'final';
Float: 'float';
For: 'for';
Friend: 'friend';
Goto: 'goto';
If: 'if';
Inline: 'inline';
Int: 'int';
Long: 'long';
Mutable: 'mutable';
Namespace: 'namespace';
New: 'new';
Noexcept: 'noexcept';
Nullptr: 'nullptr';
Operator: 'operator';
Override: 'override';
Private: 'private';
Protected: 'protected';
Public: 'public';
Register: 'register';
Reinterpret_cast: 'reinterpret_cast';
Return: 'return';
Short: 'short';
Signed: 'signed';
Sizeof: 'sizeof';
Static: 'static';
Static_assert: 'static_assert';
Static_cast: 'static_cast';
Struct: 'struct';
Switch: 'switch';
Template: 'template';
This: 'this';
Thread_local: 'thread_local';
Throw: 'throw';
//DO NOT RENAME - PYTHON NEEDS True and False
True_: 'true';
Try: 'try';
Typedef: 'typedef';
Typeid_: 'typeid';
Typename_: 'typename';
Union: 'union';
Unsigned: 'unsigned';
Using: 'using';
Virtual: 'virtual';
Void: 'void';
Volatile: 'volatile';
Wchar: 'wchar_t';
While: 'while';
/*Operators*/
LeftParen: '(';
RightParen: ')';
LeftBracket: '[';
RightBracket: ']';
LeftBrace: '{';
RightBrace: '}';
Plus: '+';
Minus: '-';
Star: '*';
Div: '/';
Mod: '%';
Caret: '^';
And: '&';
Or: '|';
Tilde: '~';
Not: '!' | 'not';
Assign: '=';
Less: '<';
Greater: '>';
PlusAssign: '+=';
MinusAssign: '-=';
StarAssign: '*=';
DivAssign: '/=';
ModAssign: '%=';
XorAssign: '^=';
AndAssign: '&=';
OrAssign: '|=';
LeftShiftAssign: '<<=';
RightShiftAssign: '>>=';
Equal: '==';
NotEqual: '!=';
LessEqual: '<=';
GreaterEqual: '>=';
AndAnd: '&&' | 'and';
OrOr: '||' | 'or';
PlusPlus: '++';
MinusMinus: '--';
Comma: ',';
ArrowStar: '->*';
Arrow: '->';
Question: '?';
Colon: ':';
Doublecolon: '::';
Semi: ';';
Dot: '.';
DotStar: '.*';
Ellipsis: '...';
fragment Hexquad:
HEXADECIMALDIGIT HEXADECIMALDIGIT HEXADECIMALDIGIT HEXADECIMALDIGIT;
fragment Universalcharactername:
'\\u' Hexquad
| '\\U' Hexquad Hexquad;
Identifier:
/*
Identifiernondigit | Identifier Identifiernondigit | Identifier DIGIT
*/
Identifiernondigit (Identifiernondigit | DIGIT)*;
fragment Identifiernondigit: NONDIGIT | Universalcharactername;
fragment NONDIGIT: [a-zA-Z_];
fragment DIGIT: [0-9];
DecimalLiteral: NONZERODIGIT ('\''? DIGIT)*;
OctalLiteral: '0' ('\''? OCTALDIGIT)*;
HexadecimalLiteral: ('0x' | '0X') HEXADECIMALDIGIT (
'\''? HEXADECIMALDIGIT
)*;
BinaryLiteral: ('0b' | '0B') BINARYDIGIT ('\''? BINARYDIGIT)*;
fragment NONZERODIGIT: [1-9];
fragment OCTALDIGIT: [0-7];
fragment HEXADECIMALDIGIT: [0-9a-fA-F];
fragment BINARYDIGIT: [01];
Integersuffix:
Unsignedsuffix Longsuffix?
| Unsignedsuffix Longlongsuffix?
| Longsuffix Unsignedsuffix?
| Longlongsuffix Unsignedsuffix?;
fragment Unsignedsuffix: [uU];
fragment Longsuffix: [lL];
fragment Longlongsuffix: 'll' | 'LL';
fragment Cchar:
~ ['\\\r\n]
| Escapesequence
| Universalcharactername;
fragment Escapesequence:
Simpleescapesequence
| Octalescapesequence
| Hexadecimalescapesequence;
fragment Simpleescapesequence:
'\\\''
| '\\"'
| '\\?'
| '\\\\'
| '\\a'
| '\\b'
| '\\f'
| '\\n'
| '\\r'
| ('\\' ('\r' '\n'? | '\n'))
| '\\t'
| '\\v';
fragment Octalescapesequence:
'\\' OCTALDIGIT
| '\\' OCTALDIGIT OCTALDIGIT
| '\\' OCTALDIGIT OCTALDIGIT OCTALDIGIT;
fragment Hexadecimalescapesequence: '\\x' HEXADECIMALDIGIT+;
fragment Fractionalconstant:
Digitsequence? '.' Digitsequence
| Digitsequence '.';
fragment Exponentpart:
'e' SIGN? Digitsequence
| 'E' SIGN? Digitsequence;
fragment SIGN: [+-];
fragment Digitsequence: DIGIT ('\''? DIGIT)*;
fragment Floatingsuffix: [flFL];
fragment Encodingprefix: 'u8' | 'u' | 'U' | 'L';
fragment Schar:
~ ["\\\r\n]
| Escapesequence
| Universalcharactername;
fragment Rawstring: 'R"' (( '\\' ["()] )|~[\r\n (])*? '(' ~[)]*? ')' (( '\\' ["()]) | ~[\r\n "])*? '"';
UserDefinedIntegerLiteral:
DecimalLiteral Udsuffix
| OctalLiteral Udsuffix
| HexadecimalLiteral Udsuffix
| BinaryLiteral Udsuffix;
UserDefinedFloatingLiteral:
Fractionalconstant Exponentpart? Udsuffix
| Digitsequence Exponentpart Udsuffix;
UserDefinedStringLiteral: StringLiteral Udsuffix;
UserDefinedCharacterLiteral: CharacterLiteral Udsuffix;
fragment Udsuffix: Identifier;
Whitespace: [ \t]+ -> skip;
Newline: ('\r' '\n'? | '\n') -> skip;
BlockComment: '/*' .*? '*/' -> skip;
LineComment: '//' ~ [\r\n]* -> skip;
File diff suppressed because one or more lines are too long
@@ -0,0 +1,757 @@
// Generated from /home/syu/workspace/MSCCD_ALL/Project/grammarDefinations/CPP14/CPP14Lexer.g4 by ANTLR 4.8
package com.itsaky.androidide.lexers.cpp;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class CPP14Lexer extends Lexer {
static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
IntegerLiteral=1, CharacterLiteral=2, FloatingLiteral=3, StringLiteral=4,
BooleanLiteral=5, PointerLiteral=6, UserDefinedLiteral=7, MultiLineMacro=8,
Directive=9, Alignas=10, Alignof=11, Asm=12, Auto=13, Bool=14, Break=15,
Case=16, Catch=17, Char=18, Char16=19, Char32=20, Class=21, Const=22,
Constexpr=23, Const_cast=24, Continue=25, Decltype=26, Default=27, Delete=28,
Do=29, Double=30, Dynamic_cast=31, Else=32, Enum=33, Explicit=34, Export=35,
Extern=36, False_=37, Final=38, Float=39, For=40, Friend=41, Goto=42,
If=43, Inline=44, Int=45, Long=46, Mutable=47, Namespace=48, New=49, Noexcept=50,
Nullptr=51, Operator=52, Override=53, Private=54, Protected=55, Public=56,
Register=57, Reinterpret_cast=58, Return=59, Short=60, Signed=61, Sizeof=62,
Static=63, Static_assert=64, Static_cast=65, Struct=66, Switch=67, Template=68,
This=69, Thread_local=70, Throw=71, True_=72, Try=73, Typedef=74, Typeid_=75,
Typename_=76, Union=77, Unsigned=78, Using=79, Virtual=80, Void=81, Volatile=82,
Wchar=83, While=84, LeftParen=85, RightParen=86, LeftBracket=87, RightBracket=88,
LeftBrace=89, RightBrace=90, Plus=91, Minus=92, Star=93, Div=94, Mod=95,
Caret=96, And=97, Or=98, Tilde=99, Not=100, Assign=101, Less=102, Greater=103,
PlusAssign=104, MinusAssign=105, StarAssign=106, DivAssign=107, ModAssign=108,
XorAssign=109, AndAssign=110, OrAssign=111, LeftShiftAssign=112, RightShiftAssign=113,
Equal=114, NotEqual=115, LessEqual=116, GreaterEqual=117, AndAnd=118,
OrOr=119, PlusPlus=120, MinusMinus=121, Comma=122, ArrowStar=123, Arrow=124,
Question=125, Colon=126, Doublecolon=127, Semi=128, Dot=129, DotStar=130,
Ellipsis=131, Identifier=132, DecimalLiteral=133, OctalLiteral=134, HexadecimalLiteral=135,
BinaryLiteral=136, Integersuffix=137, UserDefinedIntegerLiteral=138, UserDefinedFloatingLiteral=139,
UserDefinedStringLiteral=140, UserDefinedCharacterLiteral=141, Whitespace=142,
Newline=143, BlockComment=144, LineComment=145;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
public static String[] modeNames = {
"DEFAULT_MODE"
};
private static String[] makeRuleNames() {
return new String[] {
"IntegerLiteral", "CharacterLiteral", "FloatingLiteral", "StringLiteral",
"BooleanLiteral", "PointerLiteral", "UserDefinedLiteral", "MultiLineMacro",
"Directive", "Alignas", "Alignof", "Asm", "Auto", "Bool", "Break", "Case",
"Catch", "Char", "Char16", "Char32", "Class", "Const", "Constexpr", "Const_cast",
"Continue", "Decltype", "Default", "Delete", "Do", "Double", "Dynamic_cast",
"Else", "Enum", "Explicit", "Export", "Extern", "False_", "Final", "Float",
"For", "Friend", "Goto", "If", "Inline", "Int", "Long", "Mutable", "Namespace",
"New", "Noexcept", "Nullptr", "Operator", "Override", "Private", "Protected",
"Public", "Register", "Reinterpret_cast", "Return", "Short", "Signed",
"Sizeof", "Static", "Static_assert", "Static_cast", "Struct", "Switch",
"Template", "This", "Thread_local", "Throw", "True_", "Try", "Typedef",
"Typeid_", "Typename_", "Union", "Unsigned", "Using", "Virtual", "Void",
"Volatile", "Wchar", "While", "LeftParen", "RightParen", "LeftBracket",
"RightBracket", "LeftBrace", "RightBrace", "Plus", "Minus", "Star", "Div",
"Mod", "Caret", "And", "Or", "Tilde", "Not", "Assign", "Less", "Greater",
"PlusAssign", "MinusAssign", "StarAssign", "DivAssign", "ModAssign",
"XorAssign", "AndAssign", "OrAssign", "LeftShiftAssign", "RightShiftAssign",
"Equal", "NotEqual", "LessEqual", "GreaterEqual", "AndAnd", "OrOr", "PlusPlus",
"MinusMinus", "Comma", "ArrowStar", "Arrow", "Question", "Colon", "Doublecolon",
"Semi", "Dot", "DotStar", "Ellipsis", "Hexquad", "Universalcharactername",
"Identifier", "Identifiernondigit", "NONDIGIT", "DIGIT", "DecimalLiteral",
"OctalLiteral", "HexadecimalLiteral", "BinaryLiteral", "NONZERODIGIT",
"OCTALDIGIT", "HEXADECIMALDIGIT", "BINARYDIGIT", "Integersuffix", "Unsignedsuffix",
"Longsuffix", "Longlongsuffix", "Cchar", "Escapesequence", "Simpleescapesequence",
"Octalescapesequence", "Hexadecimalescapesequence", "Fractionalconstant",
"Exponentpart", "SIGN", "Digitsequence", "Floatingsuffix", "Encodingprefix",
"Schar", "Rawstring", "UserDefinedIntegerLiteral", "UserDefinedFloatingLiteral",
"UserDefinedStringLiteral", "UserDefinedCharacterLiteral", "Udsuffix",
"Whitespace", "Newline", "BlockComment", "LineComment"
};
}
public static final String[] ruleNames = makeRuleNames();
private static String[] makeLiteralNames() {
return new String[] {
null, null, null, null, null, null, null, null, null, null, "'alignas'",
"'alignof'", "'asm'", "'auto'", "'bool'", "'break'", "'case'", "'catch'",
"'char'", "'char16_t'", "'char32_t'", "'class'", "'const'", "'constexpr'",
"'const_cast'", "'continue'", "'decltype'", "'default'", "'delete'",
"'do'", "'double'", "'dynamic_cast'", "'else'", "'enum'", "'explicit'",
"'export'", "'extern'", "'false'", "'final'", "'float'", "'for'", "'friend'",
"'goto'", "'if'", "'inline'", "'int'", "'long'", "'mutable'", "'namespace'",
"'new'", "'noexcept'", "'nullptr'", "'operator'", "'override'", "'private'",
"'protected'", "'public'", "'register'", "'reinterpret_cast'", "'return'",
"'short'", "'signed'", "'sizeof'", "'static'", "'static_assert'", "'static_cast'",
"'struct'", "'switch'", "'template'", "'this'", "'thread_local'", "'throw'",
"'true'", "'try'", "'typedef'", "'typeid'", "'typename'", "'union'",
"'unsigned'", "'using'", "'virtual'", "'void'", "'volatile'", "'wchar_t'",
"'while'", "'('", "')'", "'['", "']'", "'{'", "'}'", "'+'", "'-'", "'*'",
"'/'", "'%'", "'^'", "'&'", "'|'", "'~'", null, "'='", "'<'", "'>'",
"'+='", "'-='", "'*='", "'/='", "'%='", "'^='", "'&='", "'|='", "'<<='",
"'>>='", "'=='", "'!='", "'<='", "'>='", null, null, "'++'", "'--'",
"','", "'->*'", "'->'", "'?'", "':'", "'::'", "';'", "'.'", "'.*'", "'...'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, "IntegerLiteral", "CharacterLiteral", "FloatingLiteral", "StringLiteral",
"BooleanLiteral", "PointerLiteral", "UserDefinedLiteral", "MultiLineMacro",
"Directive", "Alignas", "Alignof", "Asm", "Auto", "Bool", "Break", "Case",
"Catch", "Char", "Char16", "Char32", "Class", "Const", "Constexpr", "Const_cast",
"Continue", "Decltype", "Default", "Delete", "Do", "Double", "Dynamic_cast",
"Else", "Enum", "Explicit", "Export", "Extern", "False_", "Final", "Float",
"For", "Friend", "Goto", "If", "Inline", "Int", "Long", "Mutable", "Namespace",
"New", "Noexcept", "Nullptr", "Operator", "Override", "Private", "Protected",
"Public", "Register", "Reinterpret_cast", "Return", "Short", "Signed",
"Sizeof", "Static", "Static_assert", "Static_cast", "Struct", "Switch",
"Template", "This", "Thread_local", "Throw", "True_", "Try", "Typedef",
"Typeid_", "Typename_", "Union", "Unsigned", "Using", "Virtual", "Void",
"Volatile", "Wchar", "While", "LeftParen", "RightParen", "LeftBracket",
"RightBracket", "LeftBrace", "RightBrace", "Plus", "Minus", "Star", "Div",
"Mod", "Caret", "And", "Or", "Tilde", "Not", "Assign", "Less", "Greater",
"PlusAssign", "MinusAssign", "StarAssign", "DivAssign", "ModAssign",
"XorAssign", "AndAssign", "OrAssign", "LeftShiftAssign", "RightShiftAssign",
"Equal", "NotEqual", "LessEqual", "GreaterEqual", "AndAnd", "OrOr", "PlusPlus",
"MinusMinus", "Comma", "ArrowStar", "Arrow", "Question", "Colon", "Doublecolon",
"Semi", "Dot", "DotStar", "Ellipsis", "Identifier", "DecimalLiteral",
"OctalLiteral", "HexadecimalLiteral", "BinaryLiteral", "Integersuffix",
"UserDefinedIntegerLiteral", "UserDefinedFloatingLiteral", "UserDefinedStringLiteral",
"UserDefinedCharacterLiteral", "Whitespace", "Newline", "BlockComment",
"LineComment"
};
}
private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
/**
* @deprecated Use {@link #VOCABULARY} instead.
*/
@Deprecated
public static final String[] tokenNames;
static {
tokenNames = new String[_SYMBOLIC_NAMES.length];
for (int i = 0; i < tokenNames.length; i++) {
tokenNames[i] = VOCABULARY.getLiteralName(i);
if (tokenNames[i] == null) {
tokenNames[i] = VOCABULARY.getSymbolicName(i);
}
if (tokenNames[i] == null) {
tokenNames[i] = "<INVALID>";
}
}
}
@Override
@Deprecated
public String[] getTokenNames() {
return tokenNames;
}
@Override
public Vocabulary getVocabulary() {
return VOCABULARY;
}
public CPP14Lexer(CharStream input) {
super(input);
_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
}
@Override
public String getGrammarFileName() { return "CPP14Lexer.g4"; }
@Override
public String[] getRuleNames() { return ruleNames; }
@Override
public String getSerializedATN() { return _serializedATN; }
@Override
public String[] getChannelNames() { return channelNames; }
@Override
public String[] getModeNames() { return modeNames; }
@Override
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0093\u05b4\b\1\4"+
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
"\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+
" \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+
"+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+
"\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+
"=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+
"I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\t"+
"T\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_"+
"\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k"+
"\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv"+
"\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t"+
"\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+
"\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+
"\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+
"\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+
"\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+
"\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b"+
"\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+
"\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+
"\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+
"\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\3\2\3"+
"\2\5\2\u015c\n\2\3\2\3\2\5\2\u0160\n\2\3\2\3\2\5\2\u0164\n\2\3\2\3\2\5"+
"\2\u0168\n\2\5\2\u016a\n\2\3\3\5\3\u016d\n\3\3\3\3\3\6\3\u0171\n\3\r\3"+
"\16\3\u0172\3\3\3\3\3\4\3\4\5\4\u0179\n\4\3\4\5\4\u017c\n\4\3\4\3\4\3"+
"\4\5\4\u0181\n\4\5\4\u0183\n\4\3\5\5\5\u0186\n\5\3\5\3\5\7\5\u018a\n\5"+
"\f\5\16\5\u018d\13\5\3\5\3\5\5\5\u0191\n\5\3\5\3\5\5\5\u0195\n\5\3\6\3"+
"\6\5\6\u0199\n\6\3\7\3\7\3\b\3\b\3\b\3\b\5\b\u01a1\n\b\3\t\3\t\7\t\u01a5"+
"\n\t\f\t\16\t\u01a8\13\t\3\t\3\t\5\t\u01ac\n\t\3\t\6\t\u01af\n\t\r\t\16"+
"\t\u01b0\3\t\6\t\u01b4\n\t\r\t\16\t\u01b5\3\t\3\t\3\n\3\n\7\n\u01bc\n"+
"\n\f\n\16\n\u01bf\13\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3"+
"\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3"+
"\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3"+
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3"+
"\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3"+
"\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3"+
"\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3"+
"\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 "+
"\3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3"+
"#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3"+
"&\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3*\3*\3*\3*\3"+
"*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3/\3"+
"/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61"+
"\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63"+
"\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65"+
"\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66"+
"\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\3"+
"8\38\38\38\38\38\39\39\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\3"+
";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3"+
"=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3"+
"@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3"+
"B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3"+
"E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3"+
"G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3"+
"K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3"+
"N\3O\3O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3"+
"Q\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3"+
"U\3U\3U\3U\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3\\\3\\\3]\3]\3^"+
"\3^\3_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3d\3d\3e\3e\3e\3e\5e\u040b\ne\3f\3f"+
"\3g\3g\3h\3h\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3m\3m\3m\3n\3n\3n\3o"+
"\3o\3o\3p\3p\3p\3q\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v"+
"\3v\3v\3w\3w\3w\3w\3w\5w\u0444\nw\3x\3x\3x\3x\5x\u044a\nx\3y\3y\3y\3z"+
"\3z\3z\3{\3{\3|\3|\3|\3|\3}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3"+
"\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084"+
"\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086"+
"\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086\3\u0086"+
"\5\u0086\u047c\n\u0086\3\u0087\3\u0087\3\u0087\7\u0087\u0481\n\u0087\f"+
"\u0087\16\u0087\u0484\13\u0087\3\u0088\3\u0088\5\u0088\u0488\n\u0088\3"+
"\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\5\u008b\u0490\n\u008b\3"+
"\u008b\7\u008b\u0493\n\u008b\f\u008b\16\u008b\u0496\13\u008b\3\u008c\3"+
"\u008c\5\u008c\u049a\n\u008c\3\u008c\7\u008c\u049d\n\u008c\f\u008c\16"+
"\u008c\u04a0\13\u008c\3\u008d\3\u008d\3\u008d\3\u008d\5\u008d\u04a6\n"+
"\u008d\3\u008d\3\u008d\5\u008d\u04aa\n\u008d\3\u008d\7\u008d\u04ad\n\u008d"+
"\f\u008d\16\u008d\u04b0\13\u008d\3\u008e\3\u008e\3\u008e\3\u008e\5\u008e"+
"\u04b6\n\u008e\3\u008e\3\u008e\5\u008e\u04ba\n\u008e\3\u008e\7\u008e\u04bd"+
"\n\u008e\f\u008e\16\u008e\u04c0\13\u008e\3\u008f\3\u008f\3\u0090\3\u0090"+
"\3\u0091\3\u0091\3\u0092\3\u0092\3\u0093\3\u0093\5\u0093\u04cc\n\u0093"+
"\3\u0093\3\u0093\5\u0093\u04d0\n\u0093\3\u0093\3\u0093\5\u0093\u04d4\n"+
"\u0093\3\u0093\3\u0093\5\u0093\u04d8\n\u0093\5\u0093\u04da\n\u0093\3\u0094"+
"\3\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\5\u0096\u04e4"+
"\n\u0096\3\u0097\3\u0097\3\u0097\5\u0097\u04e9\n\u0097\3\u0098\3\u0098"+
"\3\u0098\5\u0098\u04ee\n\u0098\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
"\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
"\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\5\u0099\u0505"+
"\n\u0099\3\u0099\5\u0099\u0508\n\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+
"\5\u0099\u050e\n\u0099\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a"+
"\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u051b\n\u009a\3\u009b"+
"\3\u009b\3\u009b\3\u009b\6\u009b\u0521\n\u009b\r\u009b\16\u009b\u0522"+
"\3\u009c\5\u009c\u0526\n\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c"+
"\5\u009c\u052d\n\u009c\3\u009d\3\u009d\5\u009d\u0531\n\u009d\3\u009d\3"+
"\u009d\3\u009d\5\u009d\u0536\n\u009d\3\u009d\5\u009d\u0539\n\u009d\3\u009e"+
"\3\u009e\3\u009f\3\u009f\5\u009f\u053f\n\u009f\3\u009f\7\u009f\u0542\n"+
"\u009f\f\u009f\16\u009f\u0545\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1"+
"\3\u00a1\5\u00a1\u054c\n\u00a1\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u0551\n"+
"\u00a2\3\u00a3\3\u00a3\7\u00a3\u0555\n\u00a3\f\u00a3\16\u00a3\u0558\13"+
"\u00a3\3\u00a3\3\u00a3\7\u00a3\u055c\n\u00a3\f\u00a3\16\u00a3\u055f\13"+
"\u00a3\3\u00a3\3\u00a3\7\u00a3\u0563\n\u00a3\f\u00a3\16\u00a3\u0566\13"+
"\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4"+
"\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u0576\n\u00a4"+
"\3\u00a5\3\u00a5\5\u00a5\u057a\n\u00a5\3\u00a5\3\u00a5\3\u00a5\3\u00a5"+
"\3\u00a5\3\u00a5\5\u00a5\u0582\n\u00a5\3\u00a6\3\u00a6\3\u00a6\3\u00a7"+
"\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a9\6\u00a9\u058d\n\u00a9\r\u00a9"+
"\16\u00a9\u058e\3\u00a9\3\u00a9\3\u00aa\3\u00aa\5\u00aa\u0595\n\u00aa"+
"\3\u00aa\5\u00aa\u0598\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab"+
"\3\u00ab\7\u00ab\u05a0\n\u00ab\f\u00ab\16\u00ab\u05a3\13\u00ab\3\u00ab"+
"\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\7\u00ac"+
"\u05ae\n\u00ac\f\u00ac\16\u00ac\u05b1\13\u00ac\3\u00ac\3\u00ac\4\u01a6"+
"\u05a1\2\u00ad\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16"+
"\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34"+
"\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g"+
"\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F"+
"\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+
"d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9"+
"n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00ed"+
"x\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff"+
"\u0081\u0101\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\2\u010b\2"+
"\u010d\u0086\u010f\2\u0111\2\u0113\2\u0115\u0087\u0117\u0088\u0119\u0089"+
"\u011b\u008a\u011d\2\u011f\2\u0121\2\u0123\2\u0125\u008b\u0127\2\u0129"+
"\2\u012b\2\u012d\2\u012f\2\u0131\2\u0133\2\u0135\2\u0137\2\u0139\2\u013b"+
"\2\u013d\2\u013f\2\u0141\2\u0143\2\u0145\2\u0147\u008c\u0149\u008d\u014b"+
"\u008e\u014d\u008f\u014f\2\u0151\u0090\u0153\u0091\u0155\u0092\u0157\u0093"+
"\3\2\25\5\2NNWWww\3\2\f\f\5\2C\\aac|\3\2\62;\3\2\63;\3\2\629\5\2\62;C"+
"Hch\3\2\62\63\4\2WWww\4\2NNnn\6\2\f\f\17\17))^^\4\2--//\6\2HHNNhhnn\6"+
"\2\f\f\17\17$$^^\5\2\f\f\17\17**\5\2\f\f\17\17++\5\2\f\f\17\17$$\4\2\13"+
"\13\"\"\4\2\f\f\17\17\2\u05f7\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t"+
"\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2"+
"\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2"+
"\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2"+
"+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2"+
"\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2"+
"C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3"+
"\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2"+
"\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2"+
"i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3"+
"\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081"+
"\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2"+
"\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093"+
"\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2"+
"\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5"+
"\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2"+
"\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7"+
"\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2"+
"\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9"+
"\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2"+
"\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db"+
"\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2"+
"\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed"+
"\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2"+
"\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff"+
"\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2"+
"\2\2\u010d\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b"+
"\3\2\2\2\2\u0125\3\2\2\2\2\u0147\3\2\2\2\2\u0149\3\2\2\2\2\u014b\3\2\2"+
"\2\2\u014d\3\2\2\2\2\u0151\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157"+
"\3\2\2\2\3\u0169\3\2\2\2\5\u016c\3\2\2\2\7\u0182\3\2\2\2\t\u0194\3\2\2"+
"\2\13\u0198\3\2\2\2\r\u019a\3\2\2\2\17\u01a0\3\2\2\2\21\u01a2\3\2\2\2"+
"\23\u01b9\3\2\2\2\25\u01c2\3\2\2\2\27\u01ca\3\2\2\2\31\u01d2\3\2\2\2\33"+
"\u01d6\3\2\2\2\35\u01db\3\2\2\2\37\u01e0\3\2\2\2!\u01e6\3\2\2\2#\u01eb"+
"\3\2\2\2%\u01f1\3\2\2\2\'\u01f6\3\2\2\2)\u01ff\3\2\2\2+\u0208\3\2\2\2"+
"-\u020e\3\2\2\2/\u0214\3\2\2\2\61\u021e\3\2\2\2\63\u0229\3\2\2\2\65\u0232"+
"\3\2\2\2\67\u023b\3\2\2\29\u0243\3\2\2\2;\u024a\3\2\2\2=\u024d\3\2\2\2"+
"?\u0254\3\2\2\2A\u0261\3\2\2\2C\u0266\3\2\2\2E\u026b\3\2\2\2G\u0274\3"+
"\2\2\2I\u027b\3\2\2\2K\u0282\3\2\2\2M\u0288\3\2\2\2O\u028e\3\2\2\2Q\u0294"+
"\3\2\2\2S\u0298\3\2\2\2U\u029f\3\2\2\2W\u02a4\3\2\2\2Y\u02a7\3\2\2\2["+
"\u02ae\3\2\2\2]\u02b2\3\2\2\2_\u02b7\3\2\2\2a\u02bf\3\2\2\2c\u02c9\3\2"+
"\2\2e\u02cd\3\2\2\2g\u02d6\3\2\2\2i\u02de\3\2\2\2k\u02e7\3\2\2\2m\u02f0"+
"\3\2\2\2o\u02f8\3\2\2\2q\u0302\3\2\2\2s\u0309\3\2\2\2u\u0312\3\2\2\2w"+
"\u0323\3\2\2\2y\u032a\3\2\2\2{\u0330\3\2\2\2}\u0337\3\2\2\2\177\u033e"+
"\3\2\2\2\u0081\u0345\3\2\2\2\u0083\u0353\3\2\2\2\u0085\u035f\3\2\2\2\u0087"+
"\u0366\3\2\2\2\u0089\u036d\3\2\2\2\u008b\u0376\3\2\2\2\u008d\u037b\3\2"+
"\2\2\u008f\u0388\3\2\2\2\u0091\u038e\3\2\2\2\u0093\u0393\3\2\2\2\u0095"+
"\u0397\3\2\2\2\u0097\u039f\3\2\2\2\u0099\u03a6\3\2\2\2\u009b\u03af\3\2"+
"\2\2\u009d\u03b5\3\2\2\2\u009f\u03be\3\2\2\2\u00a1\u03c4\3\2\2\2\u00a3"+
"\u03cc\3\2\2\2\u00a5\u03d1\3\2\2\2\u00a7\u03da\3\2\2\2\u00a9\u03e2\3\2"+
"\2\2\u00ab\u03e8\3\2\2\2\u00ad\u03ea\3\2\2\2\u00af\u03ec\3\2\2\2\u00b1"+
"\u03ee\3\2\2\2\u00b3\u03f0\3\2\2\2\u00b5\u03f2\3\2\2\2\u00b7\u03f4\3\2"+
"\2\2\u00b9\u03f6\3\2\2\2\u00bb\u03f8\3\2\2\2\u00bd\u03fa\3\2\2\2\u00bf"+
"\u03fc\3\2\2\2\u00c1\u03fe\3\2\2\2\u00c3\u0400\3\2\2\2\u00c5\u0402\3\2"+
"\2\2\u00c7\u0404\3\2\2\2\u00c9\u040a\3\2\2\2\u00cb\u040c\3\2\2\2\u00cd"+
"\u040e\3\2\2\2\u00cf\u0410\3\2\2\2\u00d1\u0412\3\2\2\2\u00d3\u0415\3\2"+
"\2\2\u00d5\u0418\3\2\2\2\u00d7\u041b\3\2\2\2\u00d9\u041e\3\2\2\2\u00db"+
"\u0421\3\2\2\2\u00dd\u0424\3\2\2\2\u00df\u0427\3\2\2\2\u00e1\u042a\3\2"+
"\2\2\u00e3\u042e\3\2\2\2\u00e5\u0432\3\2\2\2\u00e7\u0435\3\2\2\2\u00e9"+
"\u0438\3\2\2\2\u00eb\u043b\3\2\2\2\u00ed\u0443\3\2\2\2\u00ef\u0449\3\2"+
"\2\2\u00f1\u044b\3\2\2\2\u00f3\u044e\3\2\2\2\u00f5\u0451\3\2\2\2\u00f7"+
"\u0453\3\2\2\2\u00f9\u0457\3\2\2\2\u00fb\u045a\3\2\2\2\u00fd\u045c\3\2"+
"\2\2\u00ff\u045e\3\2\2\2\u0101\u0461\3\2\2\2\u0103\u0463\3\2\2\2\u0105"+
"\u0465\3\2\2\2\u0107\u0468\3\2\2\2\u0109\u046c\3\2\2\2\u010b\u047b\3\2"+
"\2\2\u010d\u047d\3\2\2\2\u010f\u0487\3\2\2\2\u0111\u0489\3\2\2\2\u0113"+
"\u048b\3\2\2\2\u0115\u048d\3\2\2\2\u0117\u0497\3\2\2\2\u0119\u04a5\3\2"+
"\2\2\u011b\u04b5\3\2\2\2\u011d\u04c1\3\2\2\2\u011f\u04c3\3\2\2\2\u0121"+
"\u04c5\3\2\2\2\u0123\u04c7\3\2\2\2\u0125\u04d9\3\2\2\2\u0127\u04db\3\2"+
"\2\2\u0129\u04dd\3\2\2\2\u012b\u04e3\3\2\2\2\u012d\u04e8\3\2\2\2\u012f"+
"\u04ed\3\2\2\2\u0131\u050d\3\2\2\2\u0133\u051a\3\2\2\2\u0135\u051c\3\2"+
"\2\2\u0137\u052c\3\2\2\2\u0139\u0538\3\2\2\2\u013b\u053a\3\2\2\2\u013d"+
"\u053c\3\2\2\2\u013f\u0546\3\2\2\2\u0141\u054b\3\2\2\2\u0143\u0550\3\2"+
"\2\2\u0145\u0552\3\2\2\2\u0147\u0575\3\2\2\2\u0149\u0581\3\2\2\2\u014b"+
"\u0583\3\2\2\2\u014d\u0586\3\2\2\2\u014f\u0589\3\2\2\2\u0151\u058c\3\2"+
"\2\2\u0153\u0597\3\2\2\2\u0155\u059b\3\2\2\2\u0157\u05a9\3\2\2\2\u0159"+
"\u015b\5\u0115\u008b\2\u015a\u015c\5\u0125\u0093\2\u015b\u015a\3\2\2\2"+
"\u015b\u015c\3\2\2\2\u015c\u016a\3\2\2\2\u015d\u015f\5\u0117\u008c\2\u015e"+
"\u0160\5\u0125\u0093\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\u016a"+
"\3\2\2\2\u0161\u0163\5\u0119\u008d\2\u0162\u0164\5\u0125\u0093\2\u0163"+
"\u0162\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u016a\3\2\2\2\u0165\u0167\5\u011b"+
"\u008e\2\u0166\u0168\5\u0125\u0093\2\u0167\u0166\3\2\2\2\u0167\u0168\3"+
"\2\2\2\u0168\u016a\3\2\2\2\u0169\u0159\3\2\2\2\u0169\u015d\3\2\2\2\u0169"+
"\u0161\3\2\2\2\u0169\u0165\3\2\2\2\u016a\4\3\2\2\2\u016b\u016d\t\2\2\2"+
"\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0170"+
"\7)\2\2\u016f\u0171\5\u012d\u0097\2\u0170\u016f\3\2\2\2\u0171\u0172\3"+
"\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0174\3\2\2\2\u0174"+
"\u0175\7)\2\2\u0175\6\3\2\2\2\u0176\u0178\5\u0137\u009c\2\u0177\u0179"+
"\5\u0139\u009d\2\u0178\u0177\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017b\3"+
"\2\2\2\u017a\u017c\5\u013f\u00a0\2\u017b\u017a\3\2\2\2\u017b\u017c\3\2"+
"\2\2\u017c\u0183\3\2\2\2\u017d\u017e\5\u013d\u009f\2\u017e\u0180\5\u0139"+
"\u009d\2\u017f\u0181\5\u013f\u00a0\2\u0180\u017f\3\2\2\2\u0180\u0181\3"+
"\2\2\2\u0181\u0183\3\2\2\2\u0182\u0176\3\2\2\2\u0182\u017d\3\2\2\2\u0183"+
"\b\3\2\2\2\u0184\u0186\5\u0141\u00a1\2\u0185\u0184\3\2\2\2\u0185\u0186"+
"\3\2\2\2\u0186\u0187\3\2\2\2\u0187\u018b\7$\2\2\u0188\u018a\5\u0143\u00a2"+
"\2\u0189\u0188\3\2\2\2\u018a\u018d\3\2\2\2\u018b\u0189\3\2\2\2\u018b\u018c"+
"\3\2\2\2\u018c\u018e\3\2\2\2\u018d\u018b\3\2\2\2\u018e\u0195\7$\2\2\u018f"+
"\u0191\5\u0141\u00a1\2\u0190\u018f\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0192"+
"\3\2\2\2\u0192\u0193\7T\2\2\u0193\u0195\5\u0145\u00a3\2\u0194\u0185\3"+
"\2\2\2\u0194\u0190\3\2\2\2\u0195\n\3\2\2\2\u0196\u0199\5K&\2\u0197\u0199"+
"\5\u0091I\2\u0198\u0196\3\2\2\2\u0198\u0197\3\2\2\2\u0199\f\3\2\2\2\u019a"+
"\u019b\5g\64\2\u019b\16\3\2\2\2\u019c\u01a1\5\u0147\u00a4\2\u019d\u01a1"+
"\5\u0149\u00a5\2\u019e\u01a1\5\u014b\u00a6\2\u019f\u01a1\5\u014d\u00a7"+
"\2\u01a0\u019c\3\2\2\2\u01a0\u019d\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u019f"+
"\3\2\2\2\u01a1\20\3\2\2\2\u01a2\u01ae\7%\2\2\u01a3\u01a5\n\3\2\2\u01a4"+
"\u01a3\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a6\u01a4\3\2"+
"\2\2\u01a7\u01a9\3\2\2\2\u01a8\u01a6\3\2\2\2\u01a9\u01ab\7^\2\2\u01aa"+
"\u01ac\7\17\2\2\u01ab\u01aa\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\3"+
"\2\2\2\u01ad\u01af\7\f\2\2\u01ae\u01a6\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0"+
"\u01ae\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2\u01b4\n\3"+
"\2\2\u01b3\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5"+
"\u01b6\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b8\b\t\2\2\u01b8\22\3\2\2"+
"\2\u01b9\u01bd\7%\2\2\u01ba\u01bc\n\3\2\2\u01bb\u01ba\3\2\2\2\u01bc\u01bf"+
"\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf"+
"\u01bd\3\2\2\2\u01c0\u01c1\b\n\2\2\u01c1\24\3\2\2\2\u01c2\u01c3\7c\2\2"+
"\u01c3\u01c4\7n\2\2\u01c4\u01c5\7k\2\2\u01c5\u01c6\7i\2\2\u01c6\u01c7"+
"\7p\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\26\3\2\2\2\u01ca\u01cb"+
"\7c\2\2\u01cb\u01cc\7n\2\2\u01cc\u01cd\7k\2\2\u01cd\u01ce\7i\2\2\u01ce"+
"\u01cf\7p\2\2\u01cf\u01d0\7q\2\2\u01d0\u01d1\7h\2\2\u01d1\30\3\2\2\2\u01d2"+
"\u01d3\7c\2\2\u01d3\u01d4\7u\2\2\u01d4\u01d5\7o\2\2\u01d5\32\3\2\2\2\u01d6"+
"\u01d7\7c\2\2\u01d7\u01d8\7w\2\2\u01d8\u01d9\7v\2\2\u01d9\u01da\7q\2\2"+
"\u01da\34\3\2\2\2\u01db\u01dc\7d\2\2\u01dc\u01dd\7q\2\2\u01dd\u01de\7"+
"q\2\2\u01de\u01df\7n\2\2\u01df\36\3\2\2\2\u01e0\u01e1\7d\2\2\u01e1\u01e2"+
"\7t\2\2\u01e2\u01e3\7g\2\2\u01e3\u01e4\7c\2\2\u01e4\u01e5\7m\2\2\u01e5"+
" \3\2\2\2\u01e6\u01e7\7e\2\2\u01e7\u01e8\7c\2\2\u01e8\u01e9\7u\2\2\u01e9"+
"\u01ea\7g\2\2\u01ea\"\3\2\2\2\u01eb\u01ec\7e\2\2\u01ec\u01ed\7c\2\2\u01ed"+
"\u01ee\7v\2\2\u01ee\u01ef\7e\2\2\u01ef\u01f0\7j\2\2\u01f0$\3\2\2\2\u01f1"+
"\u01f2\7e\2\2\u01f2\u01f3\7j\2\2\u01f3\u01f4\7c\2\2\u01f4\u01f5\7t\2\2"+
"\u01f5&\3\2\2\2\u01f6\u01f7\7e\2\2\u01f7\u01f8\7j\2\2\u01f8\u01f9\7c\2"+
"\2\u01f9\u01fa\7t\2\2\u01fa\u01fb\7\63\2\2\u01fb\u01fc\78\2\2\u01fc\u01fd"+
"\7a\2\2\u01fd\u01fe\7v\2\2\u01fe(\3\2\2\2\u01ff\u0200\7e\2\2\u0200\u0201"+
"\7j\2\2\u0201\u0202\7c\2\2\u0202\u0203\7t\2\2\u0203\u0204\7\65\2\2\u0204"+
"\u0205\7\64\2\2\u0205\u0206\7a\2\2\u0206\u0207\7v\2\2\u0207*\3\2\2\2\u0208"+
"\u0209\7e\2\2\u0209\u020a\7n\2\2\u020a\u020b\7c\2\2\u020b\u020c\7u\2\2"+
"\u020c\u020d\7u\2\2\u020d,\3\2\2\2\u020e\u020f\7e\2\2\u020f\u0210\7q\2"+
"\2\u0210\u0211\7p\2\2\u0211\u0212\7u\2\2\u0212\u0213\7v\2\2\u0213.\3\2"+
"\2\2\u0214\u0215\7e\2\2\u0215\u0216\7q\2\2\u0216\u0217\7p\2\2\u0217\u0218"+
"\7u\2\2\u0218\u0219\7v\2\2\u0219\u021a\7g\2\2\u021a\u021b\7z\2\2\u021b"+
"\u021c\7r\2\2\u021c\u021d\7t\2\2\u021d\60\3\2\2\2\u021e\u021f\7e\2\2\u021f"+
"\u0220\7q\2\2\u0220\u0221\7p\2\2\u0221\u0222\7u\2\2\u0222\u0223\7v\2\2"+
"\u0223\u0224\7a\2\2\u0224\u0225\7e\2\2\u0225\u0226\7c\2\2\u0226\u0227"+
"\7u\2\2\u0227\u0228\7v\2\2\u0228\62\3\2\2\2\u0229\u022a\7e\2\2\u022a\u022b"+
"\7q\2\2\u022b\u022c\7p\2\2\u022c\u022d\7v\2\2\u022d\u022e\7k\2\2\u022e"+
"\u022f\7p\2\2\u022f\u0230\7w\2\2\u0230\u0231\7g\2\2\u0231\64\3\2\2\2\u0232"+
"\u0233\7f\2\2\u0233\u0234\7g\2\2\u0234\u0235\7e\2\2\u0235\u0236\7n\2\2"+
"\u0236\u0237\7v\2\2\u0237\u0238\7{\2\2\u0238\u0239\7r\2\2\u0239\u023a"+
"\7g\2\2\u023a\66\3\2\2\2\u023b\u023c\7f\2\2\u023c\u023d\7g\2\2\u023d\u023e"+
"\7h\2\2\u023e\u023f\7c\2\2\u023f\u0240\7w\2\2\u0240\u0241\7n\2\2\u0241"+
"\u0242\7v\2\2\u02428\3\2\2\2\u0243\u0244\7f\2\2\u0244\u0245\7g\2\2\u0245"+
"\u0246\7n\2\2\u0246\u0247\7g\2\2\u0247\u0248\7v\2\2\u0248\u0249\7g\2\2"+
"\u0249:\3\2\2\2\u024a\u024b\7f\2\2\u024b\u024c\7q\2\2\u024c<\3\2\2\2\u024d"+
"\u024e\7f\2\2\u024e\u024f\7q\2\2\u024f\u0250\7w\2\2\u0250\u0251\7d\2\2"+
"\u0251\u0252\7n\2\2\u0252\u0253\7g\2\2\u0253>\3\2\2\2\u0254\u0255\7f\2"+
"\2\u0255\u0256\7{\2\2\u0256\u0257\7p\2\2\u0257\u0258\7c\2\2\u0258\u0259"+
"\7o\2\2\u0259\u025a\7k\2\2\u025a\u025b\7e\2\2\u025b\u025c\7a\2\2\u025c"+
"\u025d\7e\2\2\u025d\u025e\7c\2\2\u025e\u025f\7u\2\2\u025f\u0260\7v\2\2"+
"\u0260@\3\2\2\2\u0261\u0262\7g\2\2\u0262\u0263\7n\2\2\u0263\u0264\7u\2"+
"\2\u0264\u0265\7g\2\2\u0265B\3\2\2\2\u0266\u0267\7g\2\2\u0267\u0268\7"+
"p\2\2\u0268\u0269\7w\2\2\u0269\u026a\7o\2\2\u026aD\3\2\2\2\u026b\u026c"+
"\7g\2\2\u026c\u026d\7z\2\2\u026d\u026e\7r\2\2\u026e\u026f\7n\2\2\u026f"+
"\u0270\7k\2\2\u0270\u0271\7e\2\2\u0271\u0272\7k\2\2\u0272\u0273\7v\2\2"+
"\u0273F\3\2\2\2\u0274\u0275\7g\2\2\u0275\u0276\7z\2\2\u0276\u0277\7r\2"+
"\2\u0277\u0278\7q\2\2\u0278\u0279\7t\2\2\u0279\u027a\7v\2\2\u027aH\3\2"+
"\2\2\u027b\u027c\7g\2\2\u027c\u027d\7z\2\2\u027d\u027e\7v\2\2\u027e\u027f"+
"\7g\2\2\u027f\u0280\7t\2\2\u0280\u0281\7p\2\2\u0281J\3\2\2\2\u0282\u0283"+
"\7h\2\2\u0283\u0284\7c\2\2\u0284\u0285\7n\2\2\u0285\u0286\7u\2\2\u0286"+
"\u0287\7g\2\2\u0287L\3\2\2\2\u0288\u0289\7h\2\2\u0289\u028a\7k\2\2\u028a"+
"\u028b\7p\2\2\u028b\u028c\7c\2\2\u028c\u028d\7n\2\2\u028dN\3\2\2\2\u028e"+
"\u028f\7h\2\2\u028f\u0290\7n\2\2\u0290\u0291\7q\2\2\u0291\u0292\7c\2\2"+
"\u0292\u0293\7v\2\2\u0293P\3\2\2\2\u0294\u0295\7h\2\2\u0295\u0296\7q\2"+
"\2\u0296\u0297\7t\2\2\u0297R\3\2\2\2\u0298\u0299\7h\2\2\u0299\u029a\7"+
"t\2\2\u029a\u029b\7k\2\2\u029b\u029c\7g\2\2\u029c\u029d\7p\2\2\u029d\u029e"+
"\7f\2\2\u029eT\3\2\2\2\u029f\u02a0\7i\2\2\u02a0\u02a1\7q\2\2\u02a1\u02a2"+
"\7v\2\2\u02a2\u02a3\7q\2\2\u02a3V\3\2\2\2\u02a4\u02a5\7k\2\2\u02a5\u02a6"+
"\7h\2\2\u02a6X\3\2\2\2\u02a7\u02a8\7k\2\2\u02a8\u02a9\7p\2\2\u02a9\u02aa"+
"\7n\2\2\u02aa\u02ab\7k\2\2\u02ab\u02ac\7p\2\2\u02ac\u02ad\7g\2\2\u02ad"+
"Z\3\2\2\2\u02ae\u02af\7k\2\2\u02af\u02b0\7p\2\2\u02b0\u02b1\7v\2\2\u02b1"+
"\\\3\2\2\2\u02b2\u02b3\7n\2\2\u02b3\u02b4\7q\2\2\u02b4\u02b5\7p\2\2\u02b5"+
"\u02b6\7i\2\2\u02b6^\3\2\2\2\u02b7\u02b8\7o\2\2\u02b8\u02b9\7w\2\2\u02b9"+
"\u02ba\7v\2\2\u02ba\u02bb\7c\2\2\u02bb\u02bc\7d\2\2\u02bc\u02bd\7n\2\2"+
"\u02bd\u02be\7g\2\2\u02be`\3\2\2\2\u02bf\u02c0\7p\2\2\u02c0\u02c1\7c\2"+
"\2\u02c1\u02c2\7o\2\2\u02c2\u02c3\7g\2\2\u02c3\u02c4\7u\2\2\u02c4\u02c5"+
"\7r\2\2\u02c5\u02c6\7c\2\2\u02c6\u02c7\7e\2\2\u02c7\u02c8\7g\2\2\u02c8"+
"b\3\2\2\2\u02c9\u02ca\7p\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7y\2\2\u02cc"+
"d\3\2\2\2\u02cd\u02ce\7p\2\2\u02ce\u02cf\7q\2\2\u02cf\u02d0\7g\2\2\u02d0"+
"\u02d1\7z\2\2\u02d1\u02d2\7e\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7r\2\2"+
"\u02d4\u02d5\7v\2\2\u02d5f\3\2\2\2\u02d6\u02d7\7p\2\2\u02d7\u02d8\7w\2"+
"\2\u02d8\u02d9\7n\2\2\u02d9\u02da\7n\2\2\u02da\u02db\7r\2\2\u02db\u02dc"+
"\7v\2\2\u02dc\u02dd\7t\2\2\u02ddh\3\2\2\2\u02de\u02df\7q\2\2\u02df\u02e0"+
"\7r\2\2\u02e0\u02e1\7g\2\2\u02e1\u02e2\7t\2\2\u02e2\u02e3\7c\2\2\u02e3"+
"\u02e4\7v\2\2\u02e4\u02e5\7q\2\2\u02e5\u02e6\7t\2\2\u02e6j\3\2\2\2\u02e7"+
"\u02e8\7q\2\2\u02e8\u02e9\7x\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\7t\2\2"+
"\u02eb\u02ec\7t\2\2\u02ec\u02ed\7k\2\2\u02ed\u02ee\7f\2\2\u02ee\u02ef"+
"\7g\2\2\u02efl\3\2\2\2\u02f0\u02f1\7r\2\2\u02f1\u02f2\7t\2\2\u02f2\u02f3"+
"\7k\2\2\u02f3\u02f4\7x\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7v\2\2\u02f6"+
"\u02f7\7g\2\2\u02f7n\3\2\2\2\u02f8\u02f9\7r\2\2\u02f9\u02fa\7t\2\2\u02fa"+
"\u02fb\7q\2\2\u02fb\u02fc\7v\2\2\u02fc\u02fd\7g\2\2\u02fd\u02fe\7e\2\2"+
"\u02fe\u02ff\7v\2\2\u02ff\u0300\7g\2\2\u0300\u0301\7f\2\2\u0301p\3\2\2"+
"\2\u0302\u0303\7r\2\2\u0303\u0304\7w\2\2\u0304\u0305\7d\2\2\u0305\u0306"+
"\7n\2\2\u0306\u0307\7k\2\2\u0307\u0308\7e\2\2\u0308r\3\2\2\2\u0309\u030a"+
"\7t\2\2\u030a\u030b\7g\2\2\u030b\u030c\7i\2\2\u030c\u030d\7k\2\2\u030d"+
"\u030e\7u\2\2\u030e\u030f\7v\2\2\u030f\u0310\7g\2\2\u0310\u0311\7t\2\2"+
"\u0311t\3\2\2\2\u0312\u0313\7t\2\2\u0313\u0314\7g\2\2\u0314\u0315\7k\2"+
"\2\u0315\u0316\7p\2\2\u0316\u0317\7v\2\2\u0317\u0318\7g\2\2\u0318\u0319"+
"\7t\2\2\u0319\u031a\7r\2\2\u031a\u031b\7t\2\2\u031b\u031c\7g\2\2\u031c"+
"\u031d\7v\2\2\u031d\u031e\7a\2\2\u031e\u031f\7e\2\2\u031f\u0320\7c\2\2"+
"\u0320\u0321\7u\2\2\u0321\u0322\7v\2\2\u0322v\3\2\2\2\u0323\u0324\7t\2"+
"\2\u0324\u0325\7g\2\2\u0325\u0326\7v\2\2\u0326\u0327\7w\2\2\u0327\u0328"+
"\7t\2\2\u0328\u0329\7p\2\2\u0329x\3\2\2\2\u032a\u032b\7u\2\2\u032b\u032c"+
"\7j\2\2\u032c\u032d\7q\2\2\u032d\u032e\7t\2\2\u032e\u032f\7v\2\2\u032f"+
"z\3\2\2\2\u0330\u0331\7u\2\2\u0331\u0332\7k\2\2\u0332\u0333\7i\2\2\u0333"+
"\u0334\7p\2\2\u0334\u0335\7g\2\2\u0335\u0336\7f\2\2\u0336|\3\2\2\2\u0337"+
"\u0338\7u\2\2\u0338\u0339\7k\2\2\u0339\u033a\7|\2\2\u033a\u033b\7g\2\2"+
"\u033b\u033c\7q\2\2\u033c\u033d\7h\2\2\u033d~\3\2\2\2\u033e\u033f\7u\2"+
"\2\u033f\u0340\7v\2\2\u0340\u0341\7c\2\2\u0341\u0342\7v\2\2\u0342\u0343"+
"\7k\2\2\u0343\u0344\7e\2\2\u0344\u0080\3\2\2\2\u0345\u0346\7u\2\2\u0346"+
"\u0347\7v\2\2\u0347\u0348\7c\2\2\u0348\u0349\7v\2\2\u0349\u034a\7k\2\2"+
"\u034a\u034b\7e\2\2\u034b\u034c\7a\2\2\u034c\u034d\7c\2\2\u034d\u034e"+
"\7u\2\2\u034e\u034f\7u\2\2\u034f\u0350\7g\2\2\u0350\u0351\7t\2\2\u0351"+
"\u0352\7v\2\2\u0352\u0082\3\2\2\2\u0353\u0354\7u\2\2\u0354\u0355\7v\2"+
"\2\u0355\u0356\7c\2\2\u0356\u0357\7v\2\2\u0357\u0358\7k\2\2\u0358\u0359"+
"\7e\2\2\u0359\u035a\7a\2\2\u035a\u035b\7e\2\2\u035b\u035c\7c\2\2\u035c"+
"\u035d\7u\2\2\u035d\u035e\7v\2\2\u035e\u0084\3\2\2\2\u035f\u0360\7u\2"+
"\2\u0360\u0361\7v\2\2\u0361\u0362\7t\2\2\u0362\u0363\7w\2\2\u0363\u0364"+
"\7e\2\2\u0364\u0365\7v\2\2\u0365\u0086\3\2\2\2\u0366\u0367\7u\2\2\u0367"+
"\u0368\7y\2\2\u0368\u0369\7k\2\2\u0369\u036a\7v\2\2\u036a\u036b\7e\2\2"+
"\u036b\u036c\7j\2\2\u036c\u0088\3\2\2\2\u036d\u036e\7v\2\2\u036e\u036f"+
"\7g\2\2\u036f\u0370\7o\2\2\u0370\u0371\7r\2\2\u0371\u0372\7n\2\2\u0372"+
"\u0373\7c\2\2\u0373\u0374\7v\2\2\u0374\u0375\7g\2\2\u0375\u008a\3\2\2"+
"\2\u0376\u0377\7v\2\2\u0377\u0378\7j\2\2\u0378\u0379\7k\2\2\u0379\u037a"+
"\7u\2\2\u037a\u008c\3\2\2\2\u037b\u037c\7v\2\2\u037c\u037d\7j\2\2\u037d"+
"\u037e\7t\2\2\u037e\u037f\7g\2\2\u037f\u0380\7c\2\2\u0380\u0381\7f\2\2"+
"\u0381\u0382\7a\2\2\u0382\u0383\7n\2\2\u0383\u0384\7q\2\2\u0384\u0385"+
"\7e\2\2\u0385\u0386\7c\2\2\u0386\u0387\7n\2\2\u0387\u008e\3\2\2\2\u0388"+
"\u0389\7v\2\2\u0389\u038a\7j\2\2\u038a\u038b\7t\2\2\u038b\u038c\7q\2\2"+
"\u038c\u038d\7y\2\2\u038d\u0090\3\2\2\2\u038e\u038f\7v\2\2\u038f\u0390"+
"\7t\2\2\u0390\u0391\7w\2\2\u0391\u0392\7g\2\2\u0392\u0092\3\2\2\2\u0393"+
"\u0394\7v\2\2\u0394\u0395\7t\2\2\u0395\u0396\7{\2\2\u0396\u0094\3\2\2"+
"\2\u0397\u0398\7v\2\2\u0398\u0399\7{\2\2\u0399\u039a\7r\2\2\u039a\u039b"+
"\7g\2\2\u039b\u039c\7f\2\2\u039c\u039d\7g\2\2\u039d\u039e\7h\2\2\u039e"+
"\u0096\3\2\2\2\u039f\u03a0\7v\2\2\u03a0\u03a1\7{\2\2\u03a1\u03a2\7r\2"+
"\2\u03a2\u03a3\7g\2\2\u03a3\u03a4\7k\2\2\u03a4\u03a5\7f\2\2\u03a5\u0098"+
"\3\2\2\2\u03a6\u03a7\7v\2\2\u03a7\u03a8\7{\2\2\u03a8\u03a9\7r\2\2\u03a9"+
"\u03aa\7g\2\2\u03aa\u03ab\7p\2\2\u03ab\u03ac\7c\2\2\u03ac\u03ad\7o\2\2"+
"\u03ad\u03ae\7g\2\2\u03ae\u009a\3\2\2\2\u03af\u03b0\7w\2\2\u03b0\u03b1"+
"\7p\2\2\u03b1\u03b2\7k\2\2\u03b2\u03b3\7q\2\2\u03b3\u03b4\7p\2\2\u03b4"+
"\u009c\3\2\2\2\u03b5\u03b6\7w\2\2\u03b6\u03b7\7p\2\2\u03b7\u03b8\7u\2"+
"\2\u03b8\u03b9\7k\2\2\u03b9\u03ba\7i\2\2\u03ba\u03bb\7p\2\2\u03bb\u03bc"+
"\7g\2\2\u03bc\u03bd\7f\2\2\u03bd\u009e\3\2\2\2\u03be\u03bf\7w\2\2\u03bf"+
"\u03c0\7u\2\2\u03c0\u03c1\7k\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7i\2\2"+
"\u03c3\u00a0\3\2\2\2\u03c4\u03c5\7x\2\2\u03c5\u03c6\7k\2\2\u03c6\u03c7"+
"\7t\2\2\u03c7\u03c8\7v\2\2\u03c8\u03c9\7w\2\2\u03c9\u03ca\7c\2\2\u03ca"+
"\u03cb\7n\2\2\u03cb\u00a2\3\2\2\2\u03cc\u03cd\7x\2\2\u03cd\u03ce\7q\2"+
"\2\u03ce\u03cf\7k\2\2\u03cf\u03d0\7f\2\2\u03d0\u00a4\3\2\2\2\u03d1\u03d2"+
"\7x\2\2\u03d2\u03d3\7q\2\2\u03d3\u03d4\7n\2\2\u03d4\u03d5\7c\2\2\u03d5"+
"\u03d6\7v\2\2\u03d6\u03d7\7k\2\2\u03d7\u03d8\7n\2\2\u03d8\u03d9\7g\2\2"+
"\u03d9\u00a6\3\2\2\2\u03da\u03db\7y\2\2\u03db\u03dc\7e\2\2\u03dc\u03dd"+
"\7j\2\2\u03dd\u03de\7c\2\2\u03de\u03df\7t\2\2\u03df\u03e0\7a\2\2\u03e0"+
"\u03e1\7v\2\2\u03e1\u00a8\3\2\2\2\u03e2\u03e3\7y\2\2\u03e3\u03e4\7j\2"+
"\2\u03e4\u03e5\7k\2\2\u03e5\u03e6\7n\2\2\u03e6\u03e7\7g\2\2\u03e7\u00aa"+
"\3\2\2\2\u03e8\u03e9\7*\2\2\u03e9\u00ac\3\2\2\2\u03ea\u03eb\7+\2\2\u03eb"+
"\u00ae\3\2\2\2\u03ec\u03ed\7]\2\2\u03ed\u00b0\3\2\2\2\u03ee\u03ef\7_\2"+
"\2\u03ef\u00b2\3\2\2\2\u03f0\u03f1\7}\2\2\u03f1\u00b4\3\2\2\2\u03f2\u03f3"+
"\7\177\2\2\u03f3\u00b6\3\2\2\2\u03f4\u03f5\7-\2\2\u03f5\u00b8\3\2\2\2"+
"\u03f6\u03f7\7/\2\2\u03f7\u00ba\3\2\2\2\u03f8\u03f9\7,\2\2\u03f9\u00bc"+
"\3\2\2\2\u03fa\u03fb\7\61\2\2\u03fb\u00be\3\2\2\2\u03fc\u03fd\7\'\2\2"+
"\u03fd\u00c0\3\2\2\2\u03fe\u03ff\7`\2\2\u03ff\u00c2\3\2\2\2\u0400\u0401"+
"\7(\2\2\u0401\u00c4\3\2\2\2\u0402\u0403\7~\2\2\u0403\u00c6\3\2\2\2\u0404"+
"\u0405\7\u0080\2\2\u0405\u00c8\3\2\2\2\u0406\u040b\7#\2\2\u0407\u0408"+
"\7p\2\2\u0408\u0409\7q\2\2\u0409\u040b\7v\2\2\u040a\u0406\3\2\2\2\u040a"+
"\u0407\3\2\2\2\u040b\u00ca\3\2\2\2\u040c\u040d\7?\2\2\u040d\u00cc\3\2"+
"\2\2\u040e\u040f\7>\2\2\u040f\u00ce\3\2\2\2\u0410\u0411\7@\2\2\u0411\u00d0"+
"\3\2\2\2\u0412\u0413\7-\2\2\u0413\u0414\7?\2\2\u0414\u00d2\3\2\2\2\u0415"+
"\u0416\7/\2\2\u0416\u0417\7?\2\2\u0417\u00d4\3\2\2\2\u0418\u0419\7,\2"+
"\2\u0419\u041a\7?\2\2\u041a\u00d6\3\2\2\2\u041b\u041c\7\61\2\2\u041c\u041d"+
"\7?\2\2\u041d\u00d8\3\2\2\2\u041e\u041f\7\'\2\2\u041f\u0420\7?\2\2\u0420"+
"\u00da\3\2\2\2\u0421\u0422\7`\2\2\u0422\u0423\7?\2\2\u0423\u00dc\3\2\2"+
"\2\u0424\u0425\7(\2\2\u0425\u0426\7?\2\2\u0426\u00de\3\2\2\2\u0427\u0428"+
"\7~\2\2\u0428\u0429\7?\2\2\u0429\u00e0\3\2\2\2\u042a\u042b\7>\2\2\u042b"+
"\u042c\7>\2\2\u042c\u042d\7?\2\2\u042d\u00e2\3\2\2\2\u042e\u042f\7@\2"+
"\2\u042f\u0430\7@\2\2\u0430\u0431\7?\2\2\u0431\u00e4\3\2\2\2\u0432\u0433"+
"\7?\2\2\u0433\u0434\7?\2\2\u0434\u00e6\3\2\2\2\u0435\u0436\7#\2\2\u0436"+
"\u0437\7?\2\2\u0437\u00e8\3\2\2\2\u0438\u0439\7>\2\2\u0439\u043a\7?\2"+
"\2\u043a\u00ea\3\2\2\2\u043b\u043c\7@\2\2\u043c\u043d\7?\2\2\u043d\u00ec"+
"\3\2\2\2\u043e\u043f\7(\2\2\u043f\u0444\7(\2\2\u0440\u0441\7c\2\2\u0441"+
"\u0442\7p\2\2\u0442\u0444\7f\2\2\u0443\u043e\3\2\2\2\u0443\u0440\3\2\2"+
"\2\u0444\u00ee\3\2\2\2\u0445\u0446\7~\2\2\u0446\u044a\7~\2\2\u0447\u0448"+
"\7q\2\2\u0448\u044a\7t\2\2\u0449\u0445\3\2\2\2\u0449\u0447\3\2\2\2\u044a"+
"\u00f0\3\2\2\2\u044b\u044c\7-\2\2\u044c\u044d\7-\2\2\u044d\u00f2\3\2\2"+
"\2\u044e\u044f\7/\2\2\u044f\u0450\7/\2\2\u0450\u00f4\3\2\2\2\u0451\u0452"+
"\7.\2\2\u0452\u00f6\3\2\2\2\u0453\u0454\7/\2\2\u0454\u0455\7@\2\2\u0455"+
"\u0456\7,\2\2\u0456\u00f8\3\2\2\2\u0457\u0458\7/\2\2\u0458\u0459\7@\2"+
"\2\u0459\u00fa\3\2\2\2\u045a\u045b\7A\2\2\u045b\u00fc\3\2\2\2\u045c\u045d"+
"\7<\2\2\u045d\u00fe\3\2\2\2\u045e\u045f\7<\2\2\u045f\u0460\7<\2\2\u0460"+
"\u0100\3\2\2\2\u0461\u0462\7=\2\2\u0462\u0102\3\2\2\2\u0463\u0464\7\60"+
"\2\2\u0464\u0104\3\2\2\2\u0465\u0466\7\60\2\2\u0466\u0467\7,\2\2\u0467"+
"\u0106\3\2\2\2\u0468\u0469\7\60\2\2\u0469\u046a\7\60\2\2\u046a\u046b\7"+
"\60\2\2\u046b\u0108\3\2\2\2\u046c\u046d\5\u0121\u0091\2\u046d\u046e\5"+
"\u0121\u0091\2\u046e\u046f\5\u0121\u0091\2\u046f\u0470\5\u0121\u0091\2"+
"\u0470\u010a\3\2\2\2\u0471\u0472\7^\2\2\u0472\u0473\7w\2\2\u0473\u0474"+
"\3\2\2\2\u0474\u047c\5\u0109\u0085\2\u0475\u0476\7^\2\2\u0476\u0477\7"+
"W\2\2\u0477\u0478\3\2\2\2\u0478\u0479\5\u0109\u0085\2\u0479\u047a\5\u0109"+
"\u0085\2\u047a\u047c\3\2\2\2\u047b\u0471\3\2\2\2\u047b\u0475\3\2\2\2\u047c"+
"\u010c\3\2\2\2\u047d\u0482\5\u010f\u0088\2\u047e\u0481\5\u010f\u0088\2"+
"\u047f\u0481\5\u0113\u008a\2\u0480\u047e\3\2\2\2\u0480\u047f\3\2\2\2\u0481"+
"\u0484\3\2\2\2\u0482\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u010e\3\2"+
"\2\2\u0484\u0482\3\2\2\2\u0485\u0488\5\u0111\u0089\2\u0486\u0488\5\u010b"+
"\u0086\2\u0487\u0485\3\2\2\2\u0487\u0486\3\2\2\2\u0488\u0110\3\2\2\2\u0489"+
"\u048a\t\4\2\2\u048a\u0112\3\2\2\2\u048b\u048c\t\5\2\2\u048c\u0114\3\2"+
"\2\2\u048d\u0494\5\u011d\u008f\2\u048e\u0490\7)\2\2\u048f\u048e\3\2\2"+
"\2\u048f\u0490\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0493\5\u0113\u008a\2"+
"\u0492\u048f\3\2\2\2\u0493\u0496\3\2\2\2\u0494\u0492\3\2\2\2\u0494\u0495"+
"\3\2\2\2\u0495\u0116\3\2\2\2\u0496\u0494\3\2\2\2\u0497\u049e\7\62\2\2"+
"\u0498\u049a\7)\2\2\u0499\u0498\3\2\2\2\u0499\u049a\3\2\2\2\u049a\u049b"+
"\3\2\2\2\u049b\u049d\5\u011f\u0090\2\u049c\u0499\3\2\2\2\u049d\u04a0\3"+
"\2\2\2\u049e\u049c\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u0118\3\2\2\2\u04a0"+
"\u049e\3\2\2\2\u04a1\u04a2\7\62\2\2\u04a2\u04a6\7z\2\2\u04a3\u04a4\7\62"+
"\2\2\u04a4\u04a6\7Z\2\2\u04a5\u04a1\3\2\2\2\u04a5\u04a3\3\2\2\2\u04a6"+
"\u04a7\3\2\2\2\u04a7\u04ae\5\u0121\u0091\2\u04a8\u04aa\7)\2\2\u04a9\u04a8"+
"\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad\5\u0121\u0091"+
"\2\u04ac\u04a9\3\2\2\2\u04ad\u04b0\3\2\2\2\u04ae\u04ac\3\2\2\2\u04ae\u04af"+
"\3\2\2\2\u04af\u011a\3\2\2\2\u04b0\u04ae\3\2\2\2\u04b1\u04b2\7\62\2\2"+
"\u04b2\u04b6\7d\2\2\u04b3\u04b4\7\62\2\2\u04b4\u04b6\7D\2\2\u04b5\u04b1"+
"\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b6\u04b7\3\2\2\2\u04b7\u04be\5\u0123\u0092"+
"\2\u04b8\u04ba\7)\2\2\u04b9\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb"+
"\3\2\2\2\u04bb\u04bd\5\u0123\u0092\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3"+
"\2\2\2\u04be\u04bc\3\2\2\2\u04be\u04bf\3\2\2\2\u04bf\u011c\3\2\2\2\u04c0"+
"\u04be\3\2\2\2\u04c1\u04c2\t\6\2\2\u04c2\u011e\3\2\2\2\u04c3\u04c4\t\7"+
"\2\2\u04c4\u0120\3\2\2\2\u04c5\u04c6\t\b\2\2\u04c6\u0122\3\2\2\2\u04c7"+
"\u04c8\t\t\2\2\u04c8\u0124\3\2\2\2\u04c9\u04cb\5\u0127\u0094\2\u04ca\u04cc"+
"\5\u0129\u0095\2\u04cb\u04ca\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc\u04da\3"+
"\2\2\2\u04cd\u04cf\5\u0127\u0094\2\u04ce\u04d0\5\u012b\u0096\2\u04cf\u04ce"+
"\3\2\2\2\u04cf\u04d0\3\2\2\2\u04d0\u04da\3\2\2\2\u04d1\u04d3\5\u0129\u0095"+
"\2\u04d2\u04d4\5\u0127\u0094\2\u04d3\u04d2\3\2\2\2\u04d3\u04d4\3\2\2\2"+
"\u04d4\u04da\3\2\2\2\u04d5\u04d7\5\u012b\u0096\2\u04d6\u04d8\5\u0127\u0094"+
"\2\u04d7\u04d6\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04da\3\2\2\2\u04d9\u04c9"+
"\3\2\2\2\u04d9\u04cd\3\2\2\2\u04d9\u04d1\3\2\2\2\u04d9\u04d5\3\2\2\2\u04da"+
"\u0126\3\2\2\2\u04db\u04dc\t\n\2\2\u04dc\u0128\3\2\2\2\u04dd\u04de\t\13"+
"\2\2\u04de\u012a\3\2\2\2\u04df\u04e0\7n\2\2\u04e0\u04e4\7n\2\2\u04e1\u04e2"+
"\7N\2\2\u04e2\u04e4\7N\2\2\u04e3\u04df\3\2\2\2\u04e3\u04e1\3\2\2\2\u04e4"+
"\u012c\3\2\2\2\u04e5\u04e9\n\f\2\2\u04e6\u04e9\5\u012f\u0098\2\u04e7\u04e9"+
"\5\u010b\u0086\2\u04e8\u04e5\3\2\2\2\u04e8\u04e6\3\2\2\2\u04e8\u04e7\3"+
"\2\2\2\u04e9\u012e\3\2\2\2\u04ea\u04ee\5\u0131\u0099\2\u04eb\u04ee\5\u0133"+
"\u009a\2\u04ec\u04ee\5\u0135\u009b\2\u04ed\u04ea\3\2\2\2\u04ed\u04eb\3"+
"\2\2\2\u04ed\u04ec\3\2\2\2\u04ee\u0130\3\2\2\2\u04ef\u04f0\7^\2\2\u04f0"+
"\u050e\7)\2\2\u04f1\u04f2\7^\2\2\u04f2\u050e\7$\2\2\u04f3\u04f4\7^\2\2"+
"\u04f4\u050e\7A\2\2\u04f5\u04f6\7^\2\2\u04f6\u050e\7^\2\2\u04f7\u04f8"+
"\7^\2\2\u04f8\u050e\7c\2\2\u04f9\u04fa\7^\2\2\u04fa\u050e\7d\2\2\u04fb"+
"\u04fc\7^\2\2\u04fc\u050e\7h\2\2\u04fd\u04fe\7^\2\2\u04fe\u050e\7p\2\2"+
"\u04ff\u0500\7^\2\2\u0500\u050e\7t\2\2\u0501\u0507\7^\2\2\u0502\u0504"+
"\7\17\2\2\u0503\u0505\7\f\2\2\u0504\u0503\3\2\2\2\u0504\u0505\3\2\2\2"+
"\u0505\u0508\3\2\2\2\u0506\u0508\7\f\2\2\u0507\u0502\3\2\2\2\u0507\u0506"+
"\3\2\2\2\u0508\u050e\3\2\2\2\u0509\u050a\7^\2\2\u050a\u050e\7v\2\2\u050b"+
"\u050c\7^\2\2\u050c\u050e\7x\2\2\u050d\u04ef\3\2\2\2\u050d\u04f1\3\2\2"+
"\2\u050d\u04f3\3\2\2\2\u050d\u04f5\3\2\2\2\u050d\u04f7\3\2\2\2\u050d\u04f9"+
"\3\2\2\2\u050d\u04fb\3\2\2\2\u050d\u04fd\3\2\2\2\u050d\u04ff\3\2\2\2\u050d"+
"\u0501\3\2\2\2\u050d\u0509\3\2\2\2\u050d\u050b\3\2\2\2\u050e\u0132\3\2"+
"\2\2\u050f\u0510\7^\2\2\u0510\u051b\5\u011f\u0090\2\u0511\u0512\7^\2\2"+
"\u0512\u0513\5\u011f\u0090\2\u0513\u0514\5\u011f\u0090\2\u0514\u051b\3"+
"\2\2\2\u0515\u0516\7^\2\2\u0516\u0517\5\u011f\u0090\2\u0517\u0518\5\u011f"+
"\u0090\2\u0518\u0519\5\u011f\u0090\2\u0519\u051b\3\2\2\2\u051a\u050f\3"+
"\2\2\2\u051a\u0511\3\2\2\2\u051a\u0515\3\2\2\2\u051b\u0134\3\2\2\2\u051c"+
"\u051d\7^\2\2\u051d\u051e\7z\2\2\u051e\u0520\3\2\2\2\u051f\u0521\5\u0121"+
"\u0091\2\u0520\u051f\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0520\3\2\2\2\u0522"+
"\u0523\3\2\2\2\u0523\u0136\3\2\2\2\u0524\u0526\5\u013d\u009f\2\u0525\u0524"+
"\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\3\2\2\2\u0527\u0528\7\60\2\2"+
"\u0528\u052d\5\u013d\u009f\2\u0529\u052a\5\u013d\u009f\2\u052a\u052b\7"+
"\60\2\2\u052b\u052d\3\2\2\2\u052c\u0525\3\2\2\2\u052c\u0529\3\2\2\2\u052d"+
"\u0138\3\2\2\2\u052e\u0530\7g\2\2\u052f\u0531\5\u013b\u009e\2\u0530\u052f"+
"\3\2\2\2\u0530\u0531\3\2\2\2\u0531\u0532\3\2\2\2\u0532\u0539\5\u013d\u009f"+
"\2\u0533\u0535\7G\2\2\u0534\u0536\5\u013b\u009e\2\u0535\u0534\3\2\2\2"+
"\u0535\u0536\3\2\2\2\u0536\u0537\3\2\2\2\u0537\u0539\5\u013d\u009f\2\u0538"+
"\u052e\3\2\2\2\u0538\u0533\3\2\2\2\u0539\u013a\3\2\2\2\u053a\u053b\t\r"+
"\2\2\u053b\u013c\3\2\2\2\u053c\u0543\5\u0113\u008a\2\u053d\u053f\7)\2"+
"\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u0542"+
"\5\u0113\u008a\2\u0541\u053e\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3"+
"\2\2\2\u0543\u0544\3\2\2\2\u0544\u013e\3\2\2\2\u0545\u0543\3\2\2\2\u0546"+
"\u0547\t\16\2\2\u0547\u0140\3\2\2\2\u0548\u0549\7w\2\2\u0549\u054c\7:"+
"\2\2\u054a\u054c\t\2\2\2\u054b\u0548\3\2\2\2\u054b\u054a\3\2\2\2\u054c"+
"\u0142\3\2\2\2\u054d\u0551\n\17\2\2\u054e\u0551\5\u012f\u0098\2\u054f"+
"\u0551\5\u010b\u0086\2\u0550\u054d\3\2\2\2\u0550\u054e\3\2\2\2\u0550\u054f"+
"\3\2\2\2\u0551\u0144\3\2\2\2\u0552\u0556\7$\2\2\u0553\u0555\n\20\2\2\u0554"+
"\u0553\3\2\2\2\u0555\u0558\3\2\2\2\u0556\u0554\3\2\2\2\u0556\u0557\3\2"+
"\2\2\u0557\u0559\3\2\2\2\u0558\u0556\3\2\2\2\u0559\u055d\7*\2\2\u055a"+
"\u055c\n\21\2\2\u055b\u055a\3\2\2\2\u055c\u055f\3\2\2\2\u055d\u055b\3"+
"\2\2\2\u055d\u055e\3\2\2\2\u055e\u0560\3\2\2\2\u055f\u055d\3\2\2\2\u0560"+
"\u0564\7+\2\2\u0561\u0563\n\22\2\2\u0562\u0561\3\2\2\2\u0563\u0566\3\2"+
"\2\2\u0564\u0562\3\2\2\2\u0564\u0565\3\2\2\2\u0565\u0567\3\2\2\2\u0566"+
"\u0564\3\2\2\2\u0567\u0568\7$\2\2\u0568\u0146\3\2\2\2\u0569\u056a\5\u0115"+
"\u008b\2\u056a\u056b\5\u014f\u00a8\2\u056b\u0576\3\2\2\2\u056c\u056d\5"+
"\u0117\u008c\2\u056d\u056e\5\u014f\u00a8\2\u056e\u0576\3\2\2\2\u056f\u0570"+
"\5\u0119\u008d\2\u0570\u0571\5\u014f\u00a8\2\u0571\u0576\3\2\2\2\u0572"+
"\u0573\5\u011b\u008e\2\u0573\u0574\5\u014f\u00a8\2\u0574\u0576\3\2\2\2"+
"\u0575\u0569\3\2\2\2\u0575\u056c\3\2\2\2\u0575\u056f\3\2\2\2\u0575\u0572"+
"\3\2\2\2\u0576\u0148\3\2\2\2\u0577\u0579\5\u0137\u009c\2\u0578\u057a\5"+
"\u0139\u009d\2\u0579\u0578\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057b\3\2"+
"\2\2\u057b\u057c\5\u014f\u00a8\2\u057c\u0582\3\2\2\2\u057d\u057e\5\u013d"+
"\u009f\2\u057e\u057f\5\u0139\u009d\2\u057f\u0580\5\u014f\u00a8\2\u0580"+
"\u0582\3\2\2\2\u0581\u0577\3\2\2\2\u0581\u057d\3\2\2\2\u0582\u014a\3\2"+
"\2\2\u0583\u0584\5\t\5\2\u0584\u0585\5\u014f\u00a8\2\u0585\u014c\3\2\2"+
"\2\u0586\u0587\5\5\3\2\u0587\u0588\5\u014f\u00a8\2\u0588\u014e\3\2\2\2"+
"\u0589\u058a\5\u010d\u0087\2\u058a\u0150\3\2\2\2\u058b\u058d\t\23\2\2"+
"\u058c\u058b\3\2\2\2\u058d\u058e\3\2\2\2\u058e\u058c\3\2\2\2\u058e\u058f"+
"\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\b\u00a9\3\2\u0591\u0152\3\2\2"+
"\2\u0592\u0594\7\17\2\2\u0593\u0595\7\f\2\2\u0594\u0593\3\2\2\2\u0594"+
"\u0595\3\2\2\2\u0595\u0598\3\2\2\2\u0596\u0598\7\f\2\2\u0597\u0592\3\2"+
"\2\2\u0597\u0596\3\2\2\2\u0598\u0599\3\2\2\2\u0599\u059a\b\u00aa\3\2\u059a"+
"\u0154\3\2\2\2\u059b\u059c\7\61\2\2\u059c\u059d\7,\2\2\u059d\u05a1\3\2"+
"\2\2\u059e\u05a0\13\2\2\2\u059f\u059e\3\2\2\2\u05a0\u05a3\3\2\2\2\u05a1"+
"\u05a2\3\2\2\2\u05a1\u059f\3\2\2\2\u05a2\u05a4\3\2\2\2\u05a3\u05a1\3\2"+
"\2\2\u05a4\u05a5\7,\2\2\u05a5\u05a6\7\61\2\2\u05a6\u05a7\3\2\2\2\u05a7"+
"\u05a8\b\u00ab\3\2\u05a8\u0156\3\2\2\2\u05a9\u05aa\7\61\2\2\u05aa\u05ab"+
"\7\61\2\2\u05ab\u05af\3\2\2\2\u05ac\u05ae\n\24\2\2\u05ad\u05ac\3\2\2\2"+
"\u05ae\u05b1\3\2\2\2\u05af\u05ad\3\2\2\2\u05af\u05b0\3\2\2\2\u05b0\u05b2"+
"\3\2\2\2\u05b1\u05af\3\2\2\2\u05b2\u05b3\b\u00ac\3\2\u05b3\u0158\3\2\2"+
"\2K\2\u015b\u015f\u0163\u0167\u0169\u016c\u0172\u0178\u017b\u0180\u0182"+
"\u0185\u018b\u0190\u0194\u0198\u01a0\u01a6\u01ab\u01b0\u01b5\u01bd\u040a"+
"\u0443\u0449\u047b\u0480\u0482\u0487\u048f\u0494\u0499\u049e\u04a5\u04a9"+
"\u04ae\u04b5\u04b9\u04be\u04cb\u04cf\u04d3\u04d7\u04d9\u04e3\u04e8\u04ed"+
"\u0504\u0507\u050d\u051a\u0522\u0525\u052c\u0530\u0535\u0538\u053e\u0543"+
"\u054b\u0550\u0556\u055d\u0564\u0575\u0579\u0581\u058e\u0594\u0597\u05a1"+
"\u05af\4\2\3\2\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
}
}
}
@@ -0,0 +1,264 @@
IntegerLiteral=1
CharacterLiteral=2
FloatingLiteral=3
StringLiteral=4
BooleanLiteral=5
PointerLiteral=6
UserDefinedLiteral=7
MultiLineMacro=8
Directive=9
Alignas=10
Alignof=11
Asm=12
Auto=13
Bool=14
Break=15
Case=16
Catch=17
Char=18
Char16=19
Char32=20
Class=21
Const=22
Constexpr=23
Const_cast=24
Continue=25
Decltype=26
Default=27
Delete=28
Do=29
Double=30
Dynamic_cast=31
Else=32
Enum=33
Explicit=34
Export=35
Extern=36
False_=37
Final=38
Float=39
For=40
Friend=41
Goto=42
If=43
Inline=44
Int=45
Long=46
Mutable=47
Namespace=48
New=49
Noexcept=50
Nullptr=51
Operator=52
Override=53
Private=54
Protected=55
Public=56
Register=57
Reinterpret_cast=58
Return=59
Short=60
Signed=61
Sizeof=62
Static=63
Static_assert=64
Static_cast=65
Struct=66
Switch=67
Template=68
This=69
Thread_local=70
Throw=71
True_=72
Try=73
Typedef=74
Typeid_=75
Typename_=76
Union=77
Unsigned=78
Using=79
Virtual=80
Void=81
Volatile=82
Wchar=83
While=84
LeftParen=85
RightParen=86
LeftBracket=87
RightBracket=88
LeftBrace=89
RightBrace=90
Plus=91
Minus=92
Star=93
Div=94
Mod=95
Caret=96
And=97
Or=98
Tilde=99
Not=100
Assign=101
Less=102
Greater=103
PlusAssign=104
MinusAssign=105
StarAssign=106
DivAssign=107
ModAssign=108
XorAssign=109
AndAssign=110
OrAssign=111
LeftShiftAssign=112
RightShiftAssign=113
Equal=114
NotEqual=115
LessEqual=116
GreaterEqual=117
AndAnd=118
OrOr=119
PlusPlus=120
MinusMinus=121
Comma=122
ArrowStar=123
Arrow=124
Question=125
Colon=126
Doublecolon=127
Semi=128
Dot=129
DotStar=130
Ellipsis=131
Identifier=132
DecimalLiteral=133
OctalLiteral=134
HexadecimalLiteral=135
BinaryLiteral=136
Integersuffix=137
UserDefinedIntegerLiteral=138
UserDefinedFloatingLiteral=139
UserDefinedStringLiteral=140
UserDefinedCharacterLiteral=141
Whitespace=142
Newline=143
BlockComment=144
LineComment=145
'alignas'=10
'alignof'=11
'asm'=12
'auto'=13
'bool'=14
'break'=15
'case'=16
'catch'=17
'char'=18
'char16_t'=19
'char32_t'=20
'class'=21
'const'=22
'constexpr'=23
'const_cast'=24
'continue'=25
'decltype'=26
'default'=27
'delete'=28
'do'=29
'double'=30
'dynamic_cast'=31
'else'=32
'enum'=33
'explicit'=34
'export'=35
'extern'=36
'false'=37
'final'=38
'float'=39
'for'=40
'friend'=41
'goto'=42
'if'=43
'inline'=44
'int'=45
'long'=46
'mutable'=47
'namespace'=48
'new'=49
'noexcept'=50
'nullptr'=51
'operator'=52
'override'=53
'private'=54
'protected'=55
'public'=56
'register'=57
'reinterpret_cast'=58
'return'=59
'short'=60
'signed'=61
'sizeof'=62
'static'=63
'static_assert'=64
'static_cast'=65
'struct'=66
'switch'=67
'template'=68
'this'=69
'thread_local'=70
'throw'=71
'true'=72
'try'=73
'typedef'=74
'typeid'=75
'typename'=76
'union'=77
'unsigned'=78
'using'=79
'virtual'=80
'void'=81
'volatile'=82
'wchar_t'=83
'while'=84
'('=85
')'=86
'['=87
']'=88
'{'=89
'}'=90
'+'=91
'-'=92
'*'=93
'/'=94
'%'=95
'^'=96
'&'=97
'|'=98
'~'=99
'='=101
'<'=102
'>'=103
'+='=104
'-='=105
'*='=106
'/='=107
'%='=108
'^='=109
'&='=110
'|='=111
'<<='=112
'>>='=113
'=='=114
'!='=115
'<='=116
'>='=117
'++'=120
'--'=121
','=122
'->*'=123
'->'=124
'?'=125
':'=126
'::'=127
';'=128
'.'=129
'.*'=130
'...'=131
@@ -0,0 +1,823 @@
/*******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2015 Camilo Sanchez (Camiloasc1) 2020 Martin Mirchev (Marti2203)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* ****************************************************************************
*/
parser grammar CPP14Parser;
options {
tokenVocab = CPP14Lexer;
}
/*Basic concepts*/
translationUnit: declarationseq? EOF;
/*Expressions*/
primaryExpression:
literal+
| This
| LeftParen expression RightParen
| idExpression
| lambdaExpression;
idExpression: unqualifiedId | qualifiedId;
unqualifiedId:
Identifier
| operatorFunctionId
| conversionFunctionId
| literalOperatorId
| Tilde (className | decltypeSpecifier)
| templateId;
qualifiedId: nestedNameSpecifier Template? unqualifiedId;
nestedNameSpecifier:
(theTypeName | namespaceName | decltypeSpecifier)? Doublecolon
| nestedNameSpecifier (
Identifier
| Template? simpleTemplateId
) Doublecolon;
lambdaExpression:
lambdaIntroducer lambdaDeclarator? compoundStatement;
lambdaIntroducer: LeftBracket lambdaCapture? RightBracket;
lambdaCapture:
captureList
| captureDefault (Comma captureList)?;
captureDefault: And | Assign;
captureList: capture (Comma capture)* Ellipsis?;
capture: simpleCapture | initcapture;
simpleCapture: And? Identifier | This;
initcapture: And? Identifier initializer;
lambdaDeclarator:
LeftParen parameterDeclarationClause? RightParen Mutable? exceptionSpecification?
attributeSpecifierSeq? trailingReturnType?;
postfixExpression:
primaryExpression
| postfixExpression LeftBracket (expression | bracedInitList) RightBracket
| postfixExpression LeftParen expressionList? RightParen
| (simpleTypeSpecifier | typeNameSpecifier) (
LeftParen expressionList? RightParen
| bracedInitList
)
| postfixExpression (Dot | Arrow) (
Template? idExpression
| pseudoDestructorName
)
| postfixExpression (PlusPlus | MinusMinus)
| (
Dynamic_cast
| Static_cast
| Reinterpret_cast
| Const_cast
) Less theTypeId Greater LeftParen expression RightParen
| typeIdOfTheTypeId LeftParen (expression | theTypeId) RightParen;
/*
add a middle layer to eliminate duplicated function declarations
*/
typeIdOfTheTypeId: Typeid_;
expressionList: initializerList;
pseudoDestructorName:
nestedNameSpecifier? (theTypeName Doublecolon)? Tilde theTypeName
| nestedNameSpecifier Template simpleTemplateId Doublecolon Tilde theTypeName
| Tilde decltypeSpecifier;
unaryExpression:
postfixExpression
| (PlusPlus | MinusMinus | unaryOperator | Sizeof) unaryExpression
| Sizeof (
LeftParen theTypeId RightParen
| Ellipsis LeftParen Identifier RightParen
)
| Alignof LeftParen theTypeId RightParen
| noExceptExpression
| newExpression
| deleteExpression;
unaryOperator: Or | Star | And | Plus | Tilde | Minus | Not;
newExpression:
Doublecolon? New newPlacement? (
newTypeId
| (LeftParen theTypeId RightParen)
) newInitializer?;
newPlacement: LeftParen expressionList RightParen;
newTypeId: typeSpecifierSeq newDeclarator?;
newDeclarator:
pointerOperator newDeclarator?
| noPointerNewDeclarator;
noPointerNewDeclarator:
LeftBracket expression RightBracket attributeSpecifierSeq?
| noPointerNewDeclarator LeftBracket constantExpression RightBracket attributeSpecifierSeq?;
newInitializer:
LeftParen expressionList? RightParen
| bracedInitList;
deleteExpression:
Doublecolon? Delete (LeftBracket RightBracket)? castExpression;
noExceptExpression: Noexcept LeftParen expression RightParen;
castExpression:
unaryExpression
| LeftParen theTypeId RightParen castExpression;
pointerMemberExpression:
castExpression ((DotStar | ArrowStar) castExpression)*;
multiplicativeExpression:
pointerMemberExpression (
(Star | Div | Mod) pointerMemberExpression
)*;
additiveExpression:
multiplicativeExpression (
(Plus | Minus) multiplicativeExpression
)*;
shiftExpression:
additiveExpression (shiftOperator additiveExpression)*;
shiftOperator: Greater Greater | Less Less;
relationalExpression:
shiftExpression (
(Less | Greater | LessEqual | GreaterEqual) shiftExpression
)*;
equalityExpression:
relationalExpression (
(Equal | NotEqual) relationalExpression
)*;
andExpression: equalityExpression (And equalityExpression)*;
exclusiveOrExpression: andExpression (Caret andExpression)*;
inclusiveOrExpression:
exclusiveOrExpression (Or exclusiveOrExpression)*;
logicalAndExpression:
inclusiveOrExpression (AndAnd inclusiveOrExpression)*;
logicalOrExpression:
logicalAndExpression (OrOr logicalAndExpression)*;
conditionalExpression:
logicalOrExpression (
Question expression Colon assignmentExpression
)?;
assignmentExpression:
conditionalExpression
| logicalOrExpression assignmentOperator initializerClause
| throwExpression;
assignmentOperator:
Assign
| StarAssign
| DivAssign
| ModAssign
| PlusAssign
| MinusAssign
| RightShiftAssign
| LeftShiftAssign
| AndAssign
| XorAssign
| OrAssign;
expression: assignmentExpression (Comma assignmentExpression)*;
constantExpression: conditionalExpression;
/*Statements*/
statement:
labeledStatement
| declarationStatement
| attributeSpecifierSeq? (
expressionStatement
| compoundStatement
| selectionStatement
| iterationStatement
| jumpStatement
| tryBlock
);
labeledStatement:
attributeSpecifierSeq? (
Identifier
| Case constantExpression
| Default
) Colon statement;
expressionStatement: expression? Semi;
compoundStatement: LeftBrace statementSeq? RightBrace;
statementSeq: statement+;
selectionStatement:
If LeftParen condition RightParen statement (Else statement)?
| Switch LeftParen condition RightParen statement;
condition:
expression
| attributeSpecifierSeq? declSpecifierSeq declarator (
Assign initializerClause
| bracedInitList
);
iterationStatement:
While LeftParen condition RightParen statement
| Do statement While LeftParen expression RightParen Semi
| For LeftParen (
forInitStatement condition? Semi expression?
| forRangeDeclaration Colon forRangeInitializer
) RightParen statement;
forInitStatement: expressionStatement | simpleDeclaration;
forRangeDeclaration:
attributeSpecifierSeq? declSpecifierSeq declarator;
forRangeInitializer: expression | bracedInitList;
jumpStatement:
(
Break
| Continue
| Return (expression | bracedInitList)?
| Goto Identifier
) Semi;
declarationStatement: blockDeclaration;
/*Declarations*/
declarationseq: declaration+;
declaration:
blockDeclaration
| functionDefinition
| templateDeclaration
| explicitInstantiation
| explicitSpecialization
| linkageSpecification
| namespaceDefinition
| emptyDeclaration
| attributeDeclaration;
blockDeclaration:
simpleDeclaration
| asmDefinition
| namespaceAliasDefinition
| usingDeclaration
| usingDirective
| staticAssertDeclaration
| aliasDeclaration
| opaqueEnumDeclaration;
aliasDeclaration:
Using Identifier attributeSpecifierSeq? Assign theTypeId Semi;
simpleDeclaration:
declSpecifierSeq? initDeclaratorList? Semi
| attributeSpecifierSeq declSpecifierSeq? initDeclaratorList Semi;
staticAssertDeclaration:
Static_assert LeftParen constantExpression Comma StringLiteral RightParen Semi;
emptyDeclaration: Semi;
attributeDeclaration: attributeSpecifierSeq Semi;
declSpecifier:
storageClassSpecifier
| typeSpecifier
| functionSpecifier
| Friend
| Typedef
| Constexpr;
declSpecifierSeq: declSpecifier+? attributeSpecifierSeq?;
storageClassSpecifier:
Register
| Static
| Thread_local
| Extern
| Mutable;
functionSpecifier: Inline | Virtual | Explicit;
typedefName: Identifier;
typeSpecifier:
trailingTypeSpecifier
| classSpecifier
| enumSpecifier;
trailingTypeSpecifier:
simpleTypeSpecifier
| elaboratedTypeSpecifier
| typeNameSpecifier
| cvQualifier;
typeSpecifierSeq: typeSpecifier+ attributeSpecifierSeq?;
trailingTypeSpecifierSeq:
trailingTypeSpecifier+ attributeSpecifierSeq?;
simpleTypeLengthModifier:
Short
| Long;
simpleTypeSignednessModifier:
Unsigned
| Signed;
simpleTypeSpecifier:
nestedNameSpecifier? theTypeName
| nestedNameSpecifier Template simpleTemplateId
| simpleTypeSignednessModifier
| simpleTypeSignednessModifier? simpleTypeLengthModifier+
| simpleTypeSignednessModifier? Char
| simpleTypeSignednessModifier? Char16
| simpleTypeSignednessModifier? Char32
| simpleTypeSignednessModifier? Wchar
| Bool
| simpleTypeSignednessModifier? simpleTypeLengthModifier* Int
| Float
| simpleTypeLengthModifier? Double
| Void
| Auto
| decltypeSpecifier;
theTypeName:
className
| enumName
| typedefName
| simpleTemplateId;
decltypeSpecifier:
Decltype LeftParen (expression | Auto) RightParen;
elaboratedTypeSpecifier:
classKey (
attributeSpecifierSeq? nestedNameSpecifier? Identifier
| simpleTemplateId
| nestedNameSpecifier Template? simpleTemplateId
)
| Enum nestedNameSpecifier? Identifier;
enumName: Identifier;
enumSpecifier:
enumHead LeftBrace (enumeratorList Comma?)? RightBrace;
enumHead:
enumkey attributeSpecifierSeq? (
nestedNameSpecifier? Identifier
)? enumbase?;
opaqueEnumDeclaration:
enumkey attributeSpecifierSeq? Identifier enumbase? Semi;
enumkey: Enum (Class | Struct)?;
enumbase: Colon typeSpecifierSeq;
enumeratorList:
enumeratorDefinition (Comma enumeratorDefinition)*;
enumeratorDefinition: enumerator (Assign constantExpression)?;
enumerator: Identifier;
namespaceName: originalNamespaceName | namespaceAlias;
originalNamespaceName: Identifier;
namespaceDefinition:
Inline? Namespace (Identifier | originalNamespaceName)? LeftBrace namespaceBody = declarationseq
? RightBrace;
namespaceAlias: Identifier;
namespaceAliasDefinition:
Namespace Identifier Assign qualifiednamespacespecifier Semi;
qualifiednamespacespecifier: nestedNameSpecifier? namespaceName;
usingDeclaration:
Using ((Typename_? nestedNameSpecifier) | Doublecolon) unqualifiedId Semi;
usingDirective:
attributeSpecifierSeq? Using Namespace nestedNameSpecifier? namespaceName Semi;
asmDefinition: Asm LeftParen StringLiteral RightParen Semi;
linkageSpecification:
Extern StringLiteral (
LeftBrace declarationseq? RightBrace
| declaration
);
attributeSpecifierSeq: attributeSpecifier+;
attributeSpecifier:
LeftBracket LeftBracket attributeList? RightBracket RightBracket
| alignmentspecifier;
alignmentspecifier:
Alignas LeftParen (theTypeId | constantExpression) Ellipsis? RightParen;
attributeList: attribute (Comma attribute)* Ellipsis?;
attribute: (attributeNamespace Doublecolon)? Identifier attributeArgumentClause?;
attributeNamespace: Identifier;
attributeArgumentClause: LeftParen balancedTokenSeq? RightParen;
balancedTokenSeq: balancedtoken+;
balancedtoken:
LeftParen balancedTokenSeq RightParen
| LeftBracket balancedTokenSeq RightBracket
| LeftBrace balancedTokenSeq RightBrace
| ~(
LeftParen
| RightParen
| LeftBrace
| RightBrace
| LeftBracket
| RightBracket
)+;
/*Declarators*/
initDeclaratorList: initDeclarator (Comma initDeclarator)*;
initDeclarator: declarator initializer?;
declarator:
pointerDeclarator
| noPointerDeclarator parametersAndQualifiers trailingReturnType;
pointerDeclarator: (pointerOperator Const?)* noPointerDeclarator;
noPointerDeclarator:
declaratorid attributeSpecifierSeq?
| noPointerDeclarator (
parametersAndQualifiers
| LeftBracket constantExpression? RightBracket attributeSpecifierSeq?
)
| LeftParen pointerDeclarator RightParen;
parametersAndQualifiers:
LeftParen parameterDeclarationClause? RightParen cvqualifierseq? refqualifier?
exceptionSpecification? attributeSpecifierSeq?;
trailingReturnType:
Arrow trailingTypeSpecifierSeq abstractDeclarator?;
pointerOperator:
(And | AndAnd) attributeSpecifierSeq?
| nestedNameSpecifier? Star attributeSpecifierSeq? cvqualifierseq?;
cvqualifierseq: cvQualifier+;
cvQualifier: Const | Volatile;
refqualifier: And | AndAnd;
declaratorid: Ellipsis? idExpression;
theTypeId: typeSpecifierSeq abstractDeclarator?;
abstractDeclarator:
pointerAbstractDeclarator
| noPointerAbstractDeclarator? parametersAndQualifiers trailingReturnType
| abstractPackDeclarator;
pointerAbstractDeclarator:
noPointerAbstractDeclarator
| pointerOperator+ noPointerAbstractDeclarator?;
noPointerAbstractDeclarator:
noPointerAbstractDeclarator (
parametersAndQualifiers
| noPointerAbstractDeclarator LeftBracket constantExpression? RightBracket
attributeSpecifierSeq?
)
| parametersAndQualifiers
| LeftBracket constantExpression? RightBracket attributeSpecifierSeq?
| LeftParen pointerAbstractDeclarator RightParen;
abstractPackDeclarator:
pointerOperator* noPointerAbstractPackDeclarator;
noPointerAbstractPackDeclarator:
noPointerAbstractPackDeclarator (
parametersAndQualifiers
| LeftBracket constantExpression? RightBracket attributeSpecifierSeq?
)
| Ellipsis;
parameterDeclarationClause:
parameterDeclarationList (Comma? Ellipsis)?;
parameterDeclarationList:
parameterDeclaration (Comma parameterDeclaration)*;
parameterDeclaration:
attributeSpecifierSeq? declSpecifierSeq (
(declarator | abstractDeclarator?) (
Assign initializerClause
)?
);
functionDefinition:
attributeSpecifierSeq? declSpecifierSeq? declarator virtualSpecifierSeq? functionBody;
functionBody:
constructorInitializer? compoundStatement
| functionTryBlock
| Assign (Default | Delete) Semi;
initializer:
braceOrEqualInitializer
| LeftParen expressionList RightParen;
braceOrEqualInitializer:
Assign initializerClause
| bracedInitList;
initializerClause: assignmentExpression | bracedInitList;
initializerList:
initializerClause Ellipsis? (
Comma initializerClause Ellipsis?
)*;
bracedInitList: LeftBrace (initializerList Comma?)? RightBrace;
/*Classes*/
className: Identifier | simpleTemplateId;
classSpecifier:
classHead LeftBrace memberSpecification? RightBrace;
classHead:
classKey attributeSpecifierSeq? (
classHeadName classVirtSpecifier?
)? baseClause?
| Union attributeSpecifierSeq? (
classHeadName classVirtSpecifier?
)?;
classHeadName: nestedNameSpecifier? className;
classVirtSpecifier: Final;
classKey: Class | Struct;
memberSpecification:
(memberdeclaration | accessSpecifier Colon)+;
memberdeclaration:
attributeSpecifierSeq? declSpecifierSeq? memberDeclaratorList? Semi
| functionDefinition
| usingDeclaration
| staticAssertDeclaration
| templateDeclaration
| aliasDeclaration
| emptyDeclaration;
memberDeclaratorList:
memberDeclarator (Comma memberDeclarator)*;
memberDeclarator:
declarator (
virtualSpecifierSeq? pureSpecifier?
| braceOrEqualInitializer?
)
| Identifier? attributeSpecifierSeq? Colon constantExpression;
virtualSpecifierSeq: virtualSpecifier+;
virtualSpecifier: Override | Final;
/*
purespecifier: Assign '0'//Conflicts with the lexer ;
*/
pureSpecifier:
Assign val = OctalLiteral {if($val.text.compareTo("0")!=0) throw new InputMismatchException(this);
};
/*Derived classes*/
baseClause: Colon baseSpecifierList;
baseSpecifierList:
baseSpecifier Ellipsis? (Comma baseSpecifier Ellipsis?)*;
baseSpecifier:
attributeSpecifierSeq? (
baseTypeSpecifier
| Virtual accessSpecifier? baseTypeSpecifier
| accessSpecifier Virtual? baseTypeSpecifier
);
classOrDeclType:
nestedNameSpecifier? className
| decltypeSpecifier;
baseTypeSpecifier: classOrDeclType;
accessSpecifier: Private | Protected | Public;
/*Special member functions*/
conversionFunctionId: Operator conversionTypeId;
conversionTypeId: typeSpecifierSeq conversionDeclarator?;
conversionDeclarator: pointerOperator conversionDeclarator?;
constructorInitializer: Colon memInitializerList;
memInitializerList:
memInitializer Ellipsis? (Comma memInitializer Ellipsis?)*;
memInitializer:
meminitializerid (
LeftParen expressionList? RightParen
| bracedInitList
);
meminitializerid: classOrDeclType | Identifier;
/*Overloading*/
operatorFunctionId: Operator theOperator;
literalOperatorId:
Operator (
StringLiteral Identifier
| UserDefinedStringLiteral
);
/*Templates*/
templateDeclaration:
Template Less templateparameterList Greater declaration;
templateparameterList:
templateParameter (Comma templateParameter)*;
templateParameter: typeParameter | parameterDeclaration;
typeParameter:
(
(Template Less templateparameterList Greater)? Class
| Typename_
) ((Ellipsis? Identifier?) | (Identifier? Assign theTypeId));
simpleTemplateId:
templateName Less templateArgumentList? Greater;
templateId:
simpleTemplateId
| (operatorFunctionId | literalOperatorId) Less templateArgumentList? Greater;
templateName: Identifier;
templateArgumentList:
templateArgument Ellipsis? (Comma templateArgument Ellipsis?)*;
templateArgument: theTypeId | constantExpression | idExpression;
typeNameSpecifier:
Typename_ nestedNameSpecifier (
Identifier
| Template? simpleTemplateId
);
explicitInstantiation: Extern? Template declaration;
explicitSpecialization: Template Less Greater declaration;
/*Exception handling*/
tryBlock: Try compoundStatement handlerSeq;
functionTryBlock:
Try constructorInitializer? compoundStatement handlerSeq;
handlerSeq: handler+;
handler:
Catch LeftParen exceptionDeclaration RightParen compoundStatement;
exceptionDeclaration:
attributeSpecifierSeq? typeSpecifierSeq (
declarator
| abstractDeclarator
)?
| Ellipsis;
throwExpression: Throw assignmentExpression?;
exceptionSpecification:
dynamicExceptionSpecification
| noeExceptSpecification;
dynamicExceptionSpecification:
Throw LeftParen typeIdList? RightParen;
typeIdList: theTypeId Ellipsis? (Comma theTypeId Ellipsis?)*;
noeExceptSpecification:
Noexcept LeftParen constantExpression RightParen
| Noexcept;
/*Preprocessing directives*/
/*Lexer*/
theOperator:
New (LeftBracket RightBracket)?
| Delete (LeftBracket RightBracket)?
| Plus
| Minus
| Star
| Div
| Mod
| Caret
| And
| Or
| Tilde
| Not
| Assign
| Greater
| Less
| GreaterEqual
| PlusAssign
| MinusAssign
| StarAssign
| ModAssign
| XorAssign
| AndAssign
| OrAssign
| Less Less
| Greater Greater
| RightShiftAssign
| LeftShiftAssign
| Equal
| NotEqual
| LessEqual
| AndAnd
| OrOr
| PlusPlus
| MinusMinus
| Comma
| ArrowStar
| Arrow
| LeftParen RightParen
| LeftBracket RightBracket;
literal:
IntegerLiteral
| CharacterLiteral
| FloatingLiteral
| StringLiteral
| BooleanLiteral
| PointerLiteral
| UserDefinedLiteral;
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,264 @@
IntegerLiteral=1
CharacterLiteral=2
FloatingLiteral=3
StringLiteral=4
BooleanLiteral=5
PointerLiteral=6
UserDefinedLiteral=7
MultiLineMacro=8
Directive=9
Alignas=10
Alignof=11
Asm=12
Auto=13
Bool=14
Break=15
Case=16
Catch=17
Char=18
Char16=19
Char32=20
Class=21
Const=22
Constexpr=23
Const_cast=24
Continue=25
Decltype=26
Default=27
Delete=28
Do=29
Double=30
Dynamic_cast=31
Else=32
Enum=33
Explicit=34
Export=35
Extern=36
False_=37
Final=38
Float=39
For=40
Friend=41
Goto=42
If=43
Inline=44
Int=45
Long=46
Mutable=47
Namespace=48
New=49
Noexcept=50
Nullptr=51
Operator=52
Override=53
Private=54
Protected=55
Public=56
Register=57
Reinterpret_cast=58
Return=59
Short=60
Signed=61
Sizeof=62
Static=63
Static_assert=64
Static_cast=65
Struct=66
Switch=67
Template=68
This=69
Thread_local=70
Throw=71
True_=72
Try=73
Typedef=74
Typeid_=75
Typename_=76
Union=77
Unsigned=78
Using=79
Virtual=80
Void=81
Volatile=82
Wchar=83
While=84
LeftParen=85
RightParen=86
LeftBracket=87
RightBracket=88
LeftBrace=89
RightBrace=90
Plus=91
Minus=92
Star=93
Div=94
Mod=95
Caret=96
And=97
Or=98
Tilde=99
Not=100
Assign=101
Less=102
Greater=103
PlusAssign=104
MinusAssign=105
StarAssign=106
DivAssign=107
ModAssign=108
XorAssign=109
AndAssign=110
OrAssign=111
LeftShiftAssign=112
RightShiftAssign=113
Equal=114
NotEqual=115
LessEqual=116
GreaterEqual=117
AndAnd=118
OrOr=119
PlusPlus=120
MinusMinus=121
Comma=122
ArrowStar=123
Arrow=124
Question=125
Colon=126
Doublecolon=127
Semi=128
Dot=129
DotStar=130
Ellipsis=131
Identifier=132
DecimalLiteral=133
OctalLiteral=134
HexadecimalLiteral=135
BinaryLiteral=136
Integersuffix=137
UserDefinedIntegerLiteral=138
UserDefinedFloatingLiteral=139
UserDefinedStringLiteral=140
UserDefinedCharacterLiteral=141
Whitespace=142
Newline=143
BlockComment=144
LineComment=145
'alignas'=10
'alignof'=11
'asm'=12
'auto'=13
'bool'=14
'break'=15
'case'=16
'catch'=17
'char'=18
'char16_t'=19
'char32_t'=20
'class'=21
'const'=22
'constexpr'=23
'const_cast'=24
'continue'=25
'decltype'=26
'default'=27
'delete'=28
'do'=29
'double'=30
'dynamic_cast'=31
'else'=32
'enum'=33
'explicit'=34
'export'=35
'extern'=36
'false'=37
'final'=38
'float'=39
'for'=40
'friend'=41
'goto'=42
'if'=43
'inline'=44
'int'=45
'long'=46
'mutable'=47
'namespace'=48
'new'=49
'noexcept'=50
'nullptr'=51
'operator'=52
'override'=53
'private'=54
'protected'=55
'public'=56
'register'=57
'reinterpret_cast'=58
'return'=59
'short'=60
'signed'=61
'sizeof'=62
'static'=63
'static_assert'=64
'static_cast'=65
'struct'=66
'switch'=67
'template'=68
'this'=69
'thread_local'=70
'throw'=71
'true'=72
'try'=73
'typedef'=74
'typeid'=75
'typename'=76
'union'=77
'unsigned'=78
'using'=79
'virtual'=80
'void'=81
'volatile'=82
'wchar_t'=83
'while'=84
'('=85
')'=86
'['=87
']'=88
'{'=89
'}'=90
'+'=91
'-'=92
'*'=93
'/'=94
'%'=95
'^'=96
'&'=97
'|'=98
'~'=99
'='=101
'<'=102
'>'=103
'+='=104
'-='=105
'*='=106
'/='=107
'%='=108
'^='=109
'&='=110
'|='=111
'<<='=112
'>>='=113
'=='=114
'!='=115
'<='=116
'>='=117
'++'=120
'--'=121
','=122
'->*'=123
'->'=124
'?'=125
':'=126
'::'=127
';'=128
'.'=129
'.*'=130
'...'=131