1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-30 09:50:13 +00:00

Implemented CParser, which handles imports at the token level.

This commit is contained in:
jespergravgaard 2019-08-25 00:20:50 +02:00
parent f4032e6c84
commit 91a7f0bb0d
22 changed files with 2322 additions and 2043 deletions

View File

@ -6,16 +6,12 @@ import dk.camelot64.kickc.model.statements.StatementCall;
import dk.camelot64.kickc.model.statements.StatementSource; import dk.camelot64.kickc.model.statements.StatementSource;
import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.symbols.Variable;
import dk.camelot64.kickc.model.values.SymbolRef; import dk.camelot64.kickc.model.values.SymbolRef;
import dk.camelot64.kickc.parser.KickCLexer; import dk.camelot64.kickc.parser.CParser;
import dk.camelot64.kickc.parser.KickCParser; import dk.camelot64.kickc.parser.KickCParser;
import dk.camelot64.kickc.parser.ParserState;
import dk.camelot64.kickc.passes.PassNCastSimplification;
import dk.camelot64.kickc.passes.*; import dk.camelot64.kickc.passes.*;
import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.*;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -67,91 +63,6 @@ public class Compiler {
program.setLog(compileLog); program.setLog(compileLog);
} }
public static void loadLinkScriptFile(String fileName, Program program, Path currentPath) {
try {
File file = loadFile(fileName, currentPath, program);
Path filePath = file.toPath();
String outputFileName = new File(program.getFileName()).getName();
String linkScript = new String(Files.readAllBytes(filePath));
linkScript = linkScript.replace("%O", outputFileName);
program.setLinkScript(filePath, linkScript);
program.setTargetPlatform(TargetPlatform.CUSTOM);
} catch(IOException e) {
throw new CompileError("Error loading link script file " + fileName, e);
}
}
public static void loadAndParseFile(String fileName, Program program, Path currentPath) {
try {
if(!fileName.endsWith(".kc")) {
fileName += ".kc";
}
File file = loadFile(fileName, currentPath, program);
List<String> imported = program.getImported();
if(imported.contains(file.getAbsolutePath())) {
return;
}
final CharStream fileStream = CharStreams.fromPath(file.toPath());
imported.add(file.getAbsolutePath());
if(program.getLog().isVerboseParse()) {
program.getLog().append("PARSING " + file.getPath().replace("\\", "/"));
program.getLog().append(fileStream.toString());
}
ParserState parserState = new ParserState();
KickCLexer lexer = new KickCLexer(fileStream);
lexer.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(
Recognizer<?, ?> recognizer,
Object offendingSymbol,
int line,
int charPositionInLine,
String msg,
RecognitionException e) {
throw new CompileError("Error parsing file " + fileStream.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg);
}
});
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
KickCParser parser = new KickCParser(tokenStream, lexer);
parser.setBuildParseTree(true);
parser.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(
Recognizer<?, ?> recognizer,
Object offendingSymbol,
int line,
int charPositionInLine,
String msg,
RecognitionException e) {
throw new CompileError("Error parsing file " + fileStream.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg);
}
});
Pass0GenerateStatementSequence pass0GenerateStatementSequence = new Pass0GenerateStatementSequence(file, tokenStream, parser.file(), program);
pass0GenerateStatementSequence.generate();
} catch(IOException e) {
throw new CompileError("Error loading file " + fileName, e);
}
}
public static File loadFile(String fileName, Path currentPath, Program program) {
List<String> searchPaths = new ArrayList<>();
searchPaths.add(currentPath.toString());
searchPaths.addAll(program.getImportPaths());
for(String importPath : searchPaths) {
if(!importPath.endsWith("/")) {
importPath += "/";
}
String filePath = importPath + fileName;
//System.out.println("Looking for file "+filePath);
File file = new File(filePath);
if(file.exists()) {
//System.out.println("Found file "+file.getAbsolutePath()+" in import path "+importPath);
return file;
}
}
throw new CompileError("File not found " + fileName);
}
public CompileLog getLog() { public CompileLog getLog() {
return program.getLog(); return program.getLog();
} }
@ -168,10 +79,14 @@ public class Compiler {
try { try {
Path currentPath = new File(".").toPath(); Path currentPath = new File(".").toPath();
if(this.linkScriptFileName != null) { if(this.linkScriptFileName != null) {
loadLinkScriptFile(linkScriptFileName, program, currentPath); SourceLoader.loadLinkScriptFile(linkScriptFileName, currentPath, program);
} }
program.setStatementSequence(new StatementSequence()); program.setStatementSequence(new StatementSequence());
loadAndParseFile(fileName, program, currentPath); CParser cParser = new CParser(program);
KickCParser.FileContext cFileContext = cParser.loadAndParseCFile(fileName, currentPath);
Pass0GenerateStatementSequence pass0GenerateStatementSequence = new Pass0GenerateStatementSequence(cParser, cFileContext, program);
pass0GenerateStatementSequence.generate();
StatementSequence sequence = program.getStatementSequence(); StatementSequence sequence = program.getStatementSequence();
sequence.addStatement(new StatementCall(null, SymbolRef.MAIN_PROC_NAME, new ArrayList<>(), new StatementSource(RuleContext.EMPTY), Comment.NO_COMMENTS)); sequence.addStatement(new StatementCall(null, SymbolRef.MAIN_PROC_NAME, new ArrayList<>(), new StatementSource(RuleContext.EMPTY), Comment.NO_COMMENTS));
program.setStatementSequence(sequence); program.setStatementSequence(sequence);

View File

@ -0,0 +1,52 @@
package dk.camelot64.kickc;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.TargetPlatform;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
/**
* Responsible for loading source files from the relevant search folders.
*/
public class SourceLoader {
public static File loadFile(String fileName, Path currentPath, Program program) {
List<String> searchPaths = new ArrayList<>();
searchPaths.add(currentPath.toString());
searchPaths.addAll(program.getImportPaths());
for(String importPath : searchPaths) {
if(!importPath.endsWith("/")) {
importPath += "/";
}
String filePath = importPath + fileName;
//System.out.println("Looking for file "+filePath);
File file = new File(filePath);
if(file.exists()) {
//System.out.println("Found file "+file.getAbsolutePath()+" in import path "+importPath);
return file;
}
}
throw new CompileError("File not found " + fileName);
}
public static void loadLinkScriptFile(String fileName, Path currentPath, Program program) {
try {
File file = loadFile(fileName, currentPath, program);
Path filePath = file.toPath();
String outputFileName = new File(program.getFileName()).getName();
String linkScript = new String(Files.readAllBytes(filePath));
linkScript = linkScript.replace("%O", outputFileName);
program.setLinkScript(filePath, linkScript);
program.setTargetPlatform(TargetPlatform.CUSTOM);
} catch(IOException e) {
throw new CompileError("Error loading link script file " + fileName, e);
}
}
}

View File

@ -1,6 +1,6 @@
package dk.camelot64.kickc.fragment; package dk.camelot64.kickc.fragment;
import dk.camelot64.kickc.AsmParser; import dk.camelot64.kickc.parser.AsmParser;
import dk.camelot64.kickc.asm.AsmClobber; import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.asm.AsmProgram; import dk.camelot64.kickc.asm.AsmProgram;
import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.Program;

View File

@ -1,11 +1,10 @@
package dk.camelot64.kickc.model.statements; package dk.camelot64.kickc.model.statements;
import dk.camelot64.kickc.AsmParser; import dk.camelot64.kickc.parser.AsmParser;
import dk.camelot64.kickc.asm.AsmClobber; import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.model.Comment; import dk.camelot64.kickc.model.Comment;
import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.values.SymbolRef; import dk.camelot64.kickc.model.values.SymbolRef;
import dk.camelot64.kickc.model.values.SymbolVariableRef;
import dk.camelot64.kickc.parser.KickCParser; import dk.camelot64.kickc.parser.KickCParser;
import java.util.List; import java.util.List;

View File

@ -1,10 +1,7 @@
package dk.camelot64.kickc; package dk.camelot64.kickc.parser;
import dk.camelot64.kickc.model.CompileError; import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.statements.StatementSource; import dk.camelot64.kickc.model.statements.StatementSource;
import dk.camelot64.kickc.parser.KickCLexer;
import dk.camelot64.kickc.parser.KickCParser;
import dk.camelot64.kickc.parser.ParserState;
import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.*;
public class AsmParser { public class AsmParser {
@ -17,9 +14,9 @@ public class AsmParser {
*/ */
public static KickCParser.AsmLinesContext parseAsm(String body, StatementSource source) { public static KickCParser.AsmLinesContext parseAsm(String body, StatementSource source) {
CodePointCharStream fragmentCharStream = CharStreams.fromString(body); CodePointCharStream fragmentCharStream = CharStreams.fromString(body);
ParserState parserState = new ParserState(); CParser cParser = new CParser(null);
KickCLexer kickCLexer = new KickCLexer(fragmentCharStream); KickCLexer kickCLexer = new KickCLexer(fragmentCharStream, cParser);
KickCParser kickCParser = new KickCParser(new CommonTokenStream(kickCLexer), kickCLexer); KickCParser kickCParser = new KickCParser(new CommonTokenStream(kickCLexer), cParser);
kickCParser.addErrorListener(new BaseErrorListener() { kickCParser.addErrorListener(new BaseErrorListener() {
@Override @Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {

View File

@ -0,0 +1,215 @@
package dk.camelot64.kickc.parser;
import dk.camelot64.kickc.SourceLoader;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.Program;
import org.antlr.v4.runtime.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Parser for C-language files.
* <p>
* Handles imports and multiple source files.
* <p>
* All state is stored in the {@link dk.camelot64.kickc.model.Program}
*/
public class CParser {
/** The Program. */
private Program program;
/** The (single) parser. */
private KickCParser parser;
/** The token stream. */
private final CommonTokenStream tokenStream;
/** The token source stack handling import files. */
private CTokenSourceStack cFileTokenStack;
/** The input files that have been parsed. Maps file name to the lexer. */
private Map<String, CFile> cFiles;
/** Names of typedefs. Used by lexer to know the difference between normal value IDENTIFIERS and TYPEIDENTIFIERS */
private List<String> typedefs;
/** True whenever the lexer/parser is parsing ASM. Enables/disables a lexer rules that might interfere.*/
private boolean modeAsm;
/** True whenever the lexer is expecting an import filename as the next token. */
private boolean modeImport;
/** A C-file that has been imported & parsed. */
public static class CFile {
/** The source file currently being parsed. */
private File file;
/** The lexer. */
private KickCLexer lexer;
CFile(File file, KickCLexer lexer) {
this.file = file;
this.lexer = lexer;
}
}
public CParser(Program program) {
this.program = program;
this.cFiles = new LinkedHashMap<>();
this.cFileTokenStack = new CTokenSourceStack();
this.tokenStream = new CommonTokenStream(cFileTokenStack);
this.parser = new KickCParser(tokenStream, this);
this.typedefs = new ArrayList<>();
parser.setBuildParseTree(true);
parser.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(
Recognizer<?, ?> recognizer,
Object offendingSymbol,
int line,
int charPositionInLine,
String msg,
RecognitionException e) {
throw new CompileError("Error parsing file " + recognizer.getInputStream().getSourceName() + "\n - Line: " + line + "\n - Message: " + msg);
}
});
}
public void addTypedef(String identifier) {
typedefs.add(identifier);
}
public boolean isTypedef(String identifier) {
return typedefs.contains(identifier);
}
public boolean isModeAsm() {
return modeAsm;
}
public void setModeAsm(boolean asm) {
modeAsm = asm;
}
public boolean isModeImport() {
return modeImport;
}
public void setModeImport(boolean modeImport) {
this.modeImport = modeImport;
}
/** Get the underlying token stream.
*
* @return The token stream
*/
public BufferedTokenStream getTokenStream() {
return tokenStream;
}
/**
* Load initial C-file and start parsing it.
* This may recursively load other C-files (if they are imported)
*
* @param fileName The file name to look for (in the search path)
* @param currentPath The current path (searched before the search path)
* @return The parse result
*/
public KickCParser.FileContext loadAndParseCFile(String fileName, Path currentPath) {
loadCFile(fileName, currentPath);
return this.parser.file();
}
/**
* Get the path of the folder containing the source file for a token
*
* @param context The source context to examine
* @return The path of the folder containing the source file of the token
*/
public Path getSourceFolderPath(ParserRuleContext context) {
Token token = context.getStart();
String sourceName = token.getTokenSource().getSourceName();
CFile cFile = cFiles.get(sourceName);
File parentFile = cFile.file.getParentFile();
return parentFile.toPath();
}
/**
* Get the path of the folder containing the source file currently being tokenized
*
* @return The path of the folder containing the source file currently being tokenized
*/
private Path getCurrentSourceFolderPath() {
TokenSource currentSource = cFileTokenStack.getCurrentSource();
String sourceName = currentSource.getSourceName();
CFile cFile = cFiles.get(sourceName);
File file = cFile.file;
File parentFile = file.getParentFile();
return parentFile.toPath();
}
/**
* Loads a C-file (if it has not already been loaded).
* The C-file is inserted into the C token stream at the current parse-point - so the parser will parse the entire content of the file before moving on.
*
* @param fileName The file name of the file
*/
public void loadCFile(String fileName) {
loadCFile(fileName, getCurrentSourceFolderPath());
}
/**
* Loads a C-file (if it has not already been loaded).
* The C-file is inserted into the C token stream at the current parse-point - so the parser will parse the entire content of the file before moving on.
*
* @param fileName The file name of the file
* @param currentPath The path of the current folder (searched before the search path).
*/
private void loadCFile(String fileName, Path currentPath) {
try {
if(fileName.startsWith("\"")) {
fileName = fileName.substring(1, fileName.length()-1);
}
if(!fileName.endsWith(".kc")) {
fileName += ".kc";
}
File file = SourceLoader.loadFile(fileName, currentPath, program);
List<String> imported = program.getImported();
if(imported.contains(file.getAbsolutePath())) {
return;
}
final CharStream fileStream = CharStreams.fromPath(file.toPath().toAbsolutePath());
imported.add(file.getAbsolutePath());
if(program.getLog().isVerboseParse()) {
program.getLog().append("PARSING " + file.getPath().replace("\\", "/"));
program.getLog().append(fileStream.toString());
}
KickCLexer lexer = new KickCLexer(fileStream, this);
lexer.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(
Recognizer<?, ?> recognizer,
Object offendingSymbol,
int line,
int charPositionInLine,
String msg,
RecognitionException e) {
throw new CompileError("Error parsing file " + fileStream.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg);
}
});
CFile cFile = new CFile(file, lexer);
cFiles.put(file.getAbsolutePath(), cFile);
cFileTokenStack.pushSource(lexer);
} catch(IOException e) {
throw new CompileError("Error parsing file " + fileName, e);
}
}
}

View File

@ -0,0 +1,76 @@
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.*;
import java.util.Stack;
/**
* An ANTLR4 Token Source that can keep track of multiple underlying source files.
*/
public class CTokenSourceStack implements TokenSource {
/** Stack of underlying sources */
private Stack<TokenSource> sourceStack;
public CTokenSourceStack() {
this.sourceStack = new Stack<>();
}
/**
* Pushes a token source at the current location.
* The pushed source will immediately be used for tokens and only when it is exhausted will tokens resume from the current source
* @param source The source to push
*/
public void pushSource(TokenSource source) {
sourceStack.push(source);
}
public TokenSource getCurrentSource() {
return sourceStack.peek();
}
@Override
public Token nextToken() {
TokenSource currentSource = getCurrentSource();
Token token = currentSource.nextToken();
if(token.getType()==Token.EOF) {
// Last token of the current source - pop the stack!
sourceStack.pop();
if(!sourceStack.isEmpty()) {
// Recurse to find next token
return nextToken();
}
}
return token;
}
@Override
public int getLine() {
return getCurrentSource().getLine();
}
@Override
public int getCharPositionInLine() {
return getCurrentSource().getCharPositionInLine();
}
@Override
public CharStream getInputStream() {
return getCurrentSource().getInputStream();
}
@Override
public String getSourceName() {
return getCurrentSource().getSourceName();
}
@Override
public void setTokenFactory(TokenFactory<?> factory) {
throw new RuntimeException("Not implemented!!");
}
@Override
public TokenFactory<?> getTokenFactory() {
return getCurrentSource().getTokenFactory();
}
}

View File

@ -4,38 +4,45 @@ grammar KickC;
@header { @header {
} }
@parser::members { @lexer::members {
ParserState state; CParser cParser;
public KickCParser(TokenStream input, KickCLexer lexer) { public KickCLexer(CharStream input, CParser cParser) {
this(input); this(input);
this.state = lexer.state; this.cParser = cParser;
}
}
@parser::members {
CParser cParser;
public KickCParser(TokenStream input, CParser cParser) {
this(input);
this.cParser = cParser;
} }
} }
@lexer::members {
ParserState state = new ParserState();
}
file file
: importSeq declSeq EOF : declSeq EOF
; ;
asmFile asmFile
: asmLines EOF : asmLines EOF
; ;
importSeq declSeq
: importDecl* : declOrImport*
;
declOrImport
: decl
| importDecl
; ;
importDecl importDecl
: 'import' STRING : IMPORT IMPORTFILE
;
declSeq
: decl+
; ;
decl decl
@ -49,7 +56,7 @@ decl
; ;
typeDef typeDef
: 'typedef' typeDecl NAME {state.addTypedef($NAME.text);} : 'typedef' typeDecl NAME {cParser.addTypedef($NAME.text);}
; ;
declTypes declTypes
@ -246,7 +253,7 @@ asmDirective
; ;
asmLines asmLines
: {state.setAsm(true);} asmLine* {state.setAsm(false);} : {cParser.setModeAsm(true);} asmLine* {cParser.setModeAsm(false);}
; ;
asmLine asmLine
@ -299,9 +306,11 @@ MNEMONIC:
; ;
KICKASM: '{{' .*? '}}'; IMPORT: 'import' { cParser.setModeImport(true); } ;
IMPORTFILE: '"' ('\\"' | ~'"')* '"' { cParser.isModeImport() }? { cParser.setModeImport(false); cParser.loadCFile(getText()); } ;
SIMPLETYPE: 'byte' | 'word' | 'dword' | 'bool' | 'char' | 'short' | 'int' | 'long' | 'void' ; SIMPLETYPE: 'byte' | 'word' | 'dword' | 'bool' | 'char' | 'short' | 'int' | 'long' | 'void' ;
STRING : '"' ('\\"' | ~'"')* '"' [z]?([ps][mu]?)?[z]?; STRING : '"' ('\\"' | ~'"')* '"' [z]?([ps][mu]?)?[z]? { !cParser.isModeImport() }? ;
CHAR : '\'' ('\\'['"rfn] | ~'\'' ) '\''; CHAR : '\'' ('\\'['"rfn] | ~'\'' ) '\'';
BOOLEAN : 'true' | 'false'; BOOLEAN : 'true' | 'false';
NUMBER : NUMFLOAT | NUMINT ; NUMBER : NUMFLOAT | NUMINT ;
@ -316,11 +325,12 @@ HEXINTEGER : ( '$' | '0x' | '0X' ) HEXDIGIT+ ;
fragment BINDIGIT : [0-1]; fragment BINDIGIT : [0-1];
fragment DECDIGIT : [0-9]; fragment DECDIGIT : [0-9];
fragment HEXDIGIT : [0-9a-fA-F]; fragment HEXDIGIT : [0-9a-fA-F];
NAME : NAME_START NAME_CHAR* {!state.isTypedef(getText())}?; NAME : NAME_START NAME_CHAR* {!cParser.isTypedef(getText())}?;
TYPEDEFNAME : NAME_START NAME_CHAR* {state.isTypedef(getText())}?; TYPEDEFNAME : NAME_START NAME_CHAR* {cParser.isTypedef(getText())}?;
fragment NAME_START : [a-zA-Z_]; fragment NAME_START : [a-zA-Z_];
fragment NAME_CHAR : [a-zA-Z0-9_]; fragment NAME_CHAR : [a-zA-Z0-9_];
ASMREL: '!' NAME_CHAR* [+-]+ {state.isAsm()}? ; ASMREL: '!' NAME_CHAR* [+-]+ {cParser.isModeAsm()}? ;
KICKASM: '{{' .*? '}}';
// Add white space to the hidden channel 1 // Add white space to the hidden channel 1
WS : [ \t\r\n\u00a0]+ -> channel(1); WS : [ \t\r\n\u00a0]+ -> channel(1);

View File

@ -91,9 +91,9 @@ T__89=90
T__90=91 T__90=91
T__91=92 T__91=92
T__92=93 T__92=93
T__93=94 MNEMONIC=94
MNEMONIC=95 IMPORT=95
KICKASM=96 IMPORTFILE=96
SIMPLETYPE=97 SIMPLETYPE=97
STRING=98 STRING=98
CHAR=99 CHAR=99
@ -110,100 +110,101 @@ HEXINTEGER=109
NAME=110 NAME=110
TYPEDEFNAME=111 TYPEDEFNAME=111
ASMREL=112 ASMREL=112
WS=113 KICKASM=113
COMMENT_LINE=114 WS=114
COMMENT_BLOCK=115 COMMENT_LINE=115
'import'=1 COMMENT_BLOCK=116
';'=2 ';'=1
'typedef'=3 'typedef'=2
','=4 ','=3
'='=5 '='=4
'('=6 '('=5
')'=7 ')'=6
'{'=8 '{'=7
'}'=9 '}'=8
'#pragma'=10 '#pragma'=9
'reserve'=11 'reserve'=10
'#reserve'=12 '#reserve'=11
'pc'=13 'pc'=12
'#pc'=14 '#pc'=13
'target'=15 'target'=14
'#target'=16 '#target'=15
'link'=17 'link'=16
'code_seg'=18 'code_seg'=17
'data_seg'=19 'data_seg'=18
'encoding'=20 'encoding'=19
'#encoding'=21 '#encoding'=20
'const'=22 'const'=21
'extern'=23 'extern'=22
'export'=24 'export'=23
'align'=25 'align'=24
'register'=26 'register'=25
'inline'=27 'inline'=26
'volatile'=28 'volatile'=27
'interrupt'=29 'interrupt'=28
'if'=30 'if'=29
'else'=31 'else'=30
'while'=32 'while'=31
'do'=33 'do'=32
'for'=34 'for'=33
'switch'=35 'switch'=34
'return'=36 'return'=35
'break'=37 'break'=36
'continue'=38 'continue'=37
'asm'=39 'asm'=38
'default:'=40 'default:'=39
'case'=41 'case'=40
':'=42 ':'=41
'..'=43 '..'=42
'signed'=44 'signed'=43
'unsigned'=45 'unsigned'=44
'*'=46 '*'=45
'['=47 '['=46
']'=48 ']'=47
'struct'=49 'struct'=48
'enum'=50 'enum'=49
'.'=51 '.'=50
'->'=52 '->'=51
'sizeof'=53 'sizeof'=52
'typeid'=54 'typeid'=53
'--'=55 '--'=54
'++'=56 '++'=55
'+'=57 '+'=56
'-'=58 '-'=57
'!'=59 '!'=58
'&'=60 '&'=59
'~'=61 '~'=60
'>>'=62 '>>'=61
'<<'=63 '<<'=62
'/'=64 '/'=63
'%'=65 '%'=64
'<'=66 '<'=65
'>'=67 '>'=66
'=='=68 '=='=67
'!='=69 '!='=68
'<='=70 '<='=69
'>='=71 '>='=70
'^'=72 '^'=71
'|'=73 '|'=72
'&&'=74 '&&'=73
'||'=75 '||'=74
'?'=76 '?'=75
'+='=77 '+='=76
'-='=78 '-='=77
'*='=79 '*='=78
'/='=80 '/='=79
'%='=81 '%='=80
'<<='=82 '<<='=81
'>>='=83 '>>='=82
'&='=84 '&='=83
'|='=85 '|='=84
'^='=86 '^='=85
'kickasm'=87 'kickasm'=86
'resource'=88 'resource'=87
'uses'=89 'uses'=88
'clobbers'=90 'clobbers'=89
'bytes'=91 'bytes'=90
'cycles'=92 'cycles'=91
'.byte'=93 '.byte'=92
'#'=94 '#'=93
'import'=95

View File

@ -42,13 +42,25 @@ public class KickCBaseListener implements KickCListener {
* *
* <p>The default implementation does nothing.</p> * <p>The default implementation does nothing.</p>
*/ */
@Override public void enterImportSeq(KickCParser.ImportSeqContext ctx) { } @Override public void enterDeclSeq(KickCParser.DeclSeqContext ctx) { }
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
* <p>The default implementation does nothing.</p> * <p>The default implementation does nothing.</p>
*/ */
@Override public void exitImportSeq(KickCParser.ImportSeqContext ctx) { } @Override public void exitDeclSeq(KickCParser.DeclSeqContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclOrImport(KickCParser.DeclOrImportContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclOrImport(KickCParser.DeclOrImportContext ctx) { }
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
@ -61,18 +73,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p> * <p>The default implementation does nothing.</p>
*/ */
@Override public void exitImportDecl(KickCParser.ImportDeclContext ctx) { } @Override public void exitImportDecl(KickCParser.ImportDeclContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclSeq(KickCParser.DeclSeqContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclSeq(KickCParser.DeclSeqContext ctx) { }
/** /**
* {@inheritDoc} * {@inheritDoc}
* *

View File

@ -33,7 +33,14 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* <p>The default implementation returns the result of calling * <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p> * {@link #visitChildren} on {@code ctx}.</p>
*/ */
@Override public T visitImportSeq(KickCParser.ImportSeqContext ctx) { return visitChildren(ctx); } @Override public T visitDeclSeq(KickCParser.DeclSeqContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclOrImport(KickCParser.DeclOrImportContext ctx) { return visitChildren(ctx); }
/** /**
* {@inheritDoc} * {@inheritDoc}
* *
@ -41,13 +48,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p> * {@link #visitChildren} on {@code ctx}.</p>
*/ */
@Override public T visitImportDecl(KickCParser.ImportDeclContext ctx) { return visitChildren(ctx); } @Override public T visitImportDecl(KickCParser.ImportDeclContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclSeq(KickCParser.DeclSeqContext ctx) { return visitChildren(ctx); }
/** /**
* {@inheritDoc} * {@inheritDoc}
* *

View File

@ -31,11 +31,11 @@ public class KickCLexer extends Lexer {
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73, T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87, T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, MNEMONIC=94,
MNEMONIC=95, KICKASM=96, SIMPLETYPE=97, STRING=98, CHAR=99, BOOLEAN=100, IMPORT=95, IMPORTFILE=96, SIMPLETYPE=97, STRING=98, CHAR=99, BOOLEAN=100,
NUMBER=101, NUMFLOAT=102, BINFLOAT=103, DECFLOAT=104, HEXFLOAT=105, NUMINT=106, NUMBER=101, NUMFLOAT=102, BINFLOAT=103, DECFLOAT=104, HEXFLOAT=105, NUMINT=106,
BININTEGER=107, DECINTEGER=108, HEXINTEGER=109, NAME=110, TYPEDEFNAME=111, BININTEGER=107, DECINTEGER=108, HEXINTEGER=109, NAME=110, TYPEDEFNAME=111,
ASMREL=112, WS=113, COMMENT_LINE=114, COMMENT_BLOCK=115; ASMREL=112, KICKASM=113, WS=114, COMMENT_LINE=115, COMMENT_BLOCK=116;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@ -56,27 +56,27 @@ public class KickCLexer extends Lexer {
"T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72", "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88",
"T__89", "T__90", "T__91", "T__92", "T__93", "MNEMONIC", "KICKASM", "SIMPLETYPE", "T__89", "T__90", "T__91", "T__92", "MNEMONIC", "IMPORT", "IMPORTFILE",
"STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
"HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"DECDIGIT", "HEXDIGIT", "NAME", "TYPEDEFNAME", "NAME_START", "NAME_CHAR", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "TYPEDEFNAME", "NAME_START",
"ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" "NAME_CHAR", "ASMREL", "KICKASM", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
}; };
private static final String[] _LITERAL_NAMES = { private static final String[] _LITERAL_NAMES = {
null, "'import'", "';'", "'typedef'", "','", "'='", "'('", "')'", "'{'", null, "';'", "'typedef'", "','", "'='", "'('", "')'", "'{'", "'}'", "'#pragma'",
"'}'", "'#pragma'", "'reserve'", "'#reserve'", "'pc'", "'#pc'", "'target'", "'reserve'", "'#reserve'", "'pc'", "'#pc'", "'target'", "'#target'", "'link'",
"'#target'", "'link'", "'code_seg'", "'data_seg'", "'encoding'", "'#encoding'", "'code_seg'", "'data_seg'", "'encoding'", "'#encoding'", "'const'", "'extern'",
"'const'", "'extern'", "'export'", "'align'", "'register'", "'inline'", "'export'", "'align'", "'register'", "'inline'", "'volatile'", "'interrupt'",
"'volatile'", "'interrupt'", "'if'", "'else'", "'while'", "'do'", "'for'", "'if'", "'else'", "'while'", "'do'", "'for'", "'switch'", "'return'",
"'switch'", "'return'", "'break'", "'continue'", "'asm'", "'default:'", "'break'", "'continue'", "'asm'", "'default:'", "'case'", "':'", "'..'",
"'case'", "':'", "'..'", "'signed'", "'unsigned'", "'*'", "'['", "']'", "'signed'", "'unsigned'", "'*'", "'['", "']'", "'struct'", "'enum'", "'.'",
"'struct'", "'enum'", "'.'", "'->'", "'sizeof'", "'typeid'", "'--'", "'++'", "'->'", "'sizeof'", "'typeid'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'",
"'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='",
"'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='", "'*='", "'/='",
"'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'", "'resource'",
"'^='", "'kickasm'", "'resource'", "'uses'", "'clobbers'", "'bytes'", "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'.byte'", "'#'", null,
"'cycles'", "'.byte'", "'#'" "'import'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -86,10 +86,11 @@ public class KickCLexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, "MNEMONIC", null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"KICKASM", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "IMPORT", "IMPORTFILE", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"HEXINTEGER", "NAME", "TYPEDEFNAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" "DECINTEGER", "HEXINTEGER", "NAME", "TYPEDEFNAME", "ASMREL", "KICKASM",
"WS", "COMMENT_LINE", "COMMENT_BLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -125,7 +126,12 @@ public class KickCLexer extends Lexer {
} }
ParserState state = new ParserState(); CParser cParser;
public KickCLexer(CharStream input, CParser cParser) {
this(input);
this.cParser = cParser;
}
public KickCLexer(CharStream input) { public KickCLexer(CharStream input) {
@ -151,9 +157,38 @@ public class KickCLexer extends Lexer {
@Override @Override
public ATN getATN() { return _ATN; } public ATN getATN() { return _ATN; }
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 94:
IMPORT_action((RuleContext)_localctx, actionIndex);
break;
case 95:
IMPORTFILE_action((RuleContext)_localctx, actionIndex);
break;
}
}
private void IMPORT_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 0:
cParser.setModeImport(true);
break;
}
}
private void IMPORTFILE_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 1:
cParser.setModeImport(false); cParser.loadCFile(getText());
break;
}
}
@Override @Override
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
switch (ruleIndex) { switch (ruleIndex) {
case 95:
return IMPORTFILE_sempred((RuleContext)_localctx, predIndex);
case 97:
return STRING_sempred((RuleContext)_localctx, predIndex);
case 112: case 112:
return NAME_sempred((RuleContext)_localctx, predIndex); return NAME_sempred((RuleContext)_localctx, predIndex);
case 113: case 113:
@ -163,30 +198,44 @@ public class KickCLexer extends Lexer {
} }
return true; return true;
} }
private boolean NAME_sempred(RuleContext _localctx, int predIndex) { private boolean IMPORTFILE_sempred(RuleContext _localctx, int predIndex) {
switch (predIndex) { switch (predIndex) {
case 0: case 0:
return !state.isTypedef(getText()); return cParser.isModeImport() ;
}
return true;
}
private boolean STRING_sempred(RuleContext _localctx, int predIndex) {
switch (predIndex) {
case 1:
return !cParser.isModeImport() ;
}
return true;
}
private boolean NAME_sempred(RuleContext _localctx, int predIndex) {
switch (predIndex) {
case 2:
return !cParser.isTypedef(getText());
} }
return true; return true;
} }
private boolean TYPEDEFNAME_sempred(RuleContext _localctx, int predIndex) { private boolean TYPEDEFNAME_sempred(RuleContext _localctx, int predIndex) {
switch (predIndex) { switch (predIndex) {
case 1: case 3:
return state.isTypedef(getText()); return cParser.isTypedef(getText());
} }
return true; return true;
} }
private boolean ASMREL_sempred(RuleContext _localctx, int predIndex) { private boolean ASMREL_sempred(RuleContext _localctx, int predIndex) {
switch (predIndex) { switch (predIndex) {
case 2: case 4:
return state.isAsm(); return cParser.isModeAsm();
} }
return true; return true;
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2u\u0499\b\1\4\2\t"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2v\u04ac\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"+ "\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"+ "\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\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"+
@ -199,58 +248,59 @@ public class KickCLexer extends Lexer {
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "\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\t"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+
"k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+
"w\tw\4x\tx\4y\ty\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3"+ "w\tw\4x\tx\4y\ty\4z\tz\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4"+
"\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3"+ "\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\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"+ "\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\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3"+ "\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17"+
"\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ "\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21"+
"\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23"+
"\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"+ "\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"+
"\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+ "\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"+
"\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"+ "\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30"+
"\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\33\3"+ "\3\30\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"+
"\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"+ "\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34"+
"\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3"+ "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
"\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3"+ "\3\36\3\36\3\36\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)\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\61\3\61\3\62\3"+ "-\3-\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+
"\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\65\3"+ "\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\65"+
"\65\3\65\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"+ "\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\38\3"+
"\67\3\67\38\38\38\39\39\39\3:\3:\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3?\3@\3"+ "8\38\39\39\3:\3:\3;\3;\3<\3<\3=\3=\3>\3>\3>\3?\3?\3?\3@\3@\3A\3A\3B\3"+
"@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3H\3I\3"+ "B\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3I\3I\3J\3J\3J\3K\3"+
"I\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3"+ "K\3K\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3R\3"+
"R\3R\3R\3S\3S\3S\3S\3T\3T\3T\3T\3U\3U\3U\3V\3V\3V\3W\3W\3W\3X\3X\3X\3"+ "S\3S\3S\3S\3T\3T\3T\3U\3U\3U\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3X\3X\3"+
"X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3"+ "X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\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`\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`\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_\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_\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`\5`\u038d\n"+ "_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\3_\5_\u0388\n_\3`\3`\3`\3`\3`\3`\3"+
"`\3a\3a\3a\3a\7a\u0393\na\fa\16a\u0396\13a\3a\3a\3a\3b\3b\3b\3b\3b\3b"+ "`\3`\3`\3a\3a\3a\3a\7a\u0397\na\fa\16a\u039a\13a\3a\3a\3a\3a\3b\3b\3b"+
"\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b"+ "\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b"+
"\3b\3b\3b\3b\3b\3b\3b\3b\5b\u03c0\nb\3c\3c\3c\3c\7c\u03c6\nc\fc\16c\u03c9"+ "\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\3b\5b\u03c5\nb\3c\3c\3c\3c\7c\u03cb\nc"+
"\13c\3c\3c\5c\u03cd\nc\3c\3c\5c\u03d1\nc\5c\u03d3\nc\3c\5c\u03d6\nc\3"+ "\fc\16c\u03ce\13c\3c\3c\5c\u03d2\nc\3c\3c\5c\u03d6\nc\5c\u03d8\nc\3c\5"+
"d\3d\3d\3d\5d\u03dc\nd\3d\3d\3e\3e\3e\3e\3e\3e\3e\3e\3e\5e\u03e9\ne\3"+ "c\u03db\nc\3c\3c\3d\3d\3d\3d\5d\u03e3\nd\3d\3d\3e\3e\3e\3e\3e\3e\3e\3"+
"f\3f\5f\u03ed\nf\3g\3g\3g\5g\u03f2\ng\3h\3h\3h\3h\3h\5h\u03f9\nh\3h\7"+ "e\3e\5e\u03f0\ne\3f\3f\5f\u03f4\nf\3g\3g\3g\5g\u03f9\ng\3h\3h\3h\3h\3"+
"h\u03fc\nh\fh\16h\u03ff\13h\3h\3h\6h\u0403\nh\rh\16h\u0404\3i\7i\u0408"+ "h\5h\u0400\nh\3h\7h\u0403\nh\fh\16h\u0406\13h\3h\3h\6h\u040a\nh\rh\16"+
"\ni\fi\16i\u040b\13i\3i\3i\6i\u040f\ni\ri\16i\u0410\3j\3j\3j\3j\3j\5j"+ "h\u040b\3i\7i\u040f\ni\fi\16i\u0412\13i\3i\3i\6i\u0416\ni\ri\16i\u0417"+
"\u0418\nj\3j\7j\u041b\nj\fj\16j\u041e\13j\3j\3j\6j\u0422\nj\rj\16j\u0423"+ "\3j\3j\3j\3j\3j\5j\u041f\nj\3j\7j\u0422\nj\fj\16j\u0425\13j\3j\3j\6j\u0429"+
"\3k\3k\3k\5k\u0429\nk\3k\3k\3k\5k\u042e\nk\3l\3l\3l\6l\u0433\nl\rl\16"+ "\nj\rj\16j\u042a\3k\3k\3k\5k\u0430\nk\3k\3k\3k\5k\u0435\nk\3l\3l\3l\6"+
"l\u0434\3l\3l\6l\u0439\nl\rl\16l\u043a\5l\u043d\nl\3m\6m\u0440\nm\rm\16"+ "l\u043a\nl\rl\16l\u043b\3l\3l\6l\u0440\nl\rl\16l\u0441\5l\u0444\nl\3m"+
"m\u0441\3n\3n\3n\3n\3n\5n\u0449\nn\3n\6n\u044c\nn\rn\16n\u044d\3o\3o\3"+ "\6m\u0447\nm\rm\16m\u0448\3n\3n\3n\3n\3n\5n\u0450\nn\3n\6n\u0453\nn\r"+
"p\3p\3q\3q\3r\3r\7r\u0458\nr\fr\16r\u045b\13r\3r\3r\3s\3s\7s\u0461\ns"+ "n\16n\u0454\3o\3o\3p\3p\3q\3q\3r\3r\7r\u045f\nr\fr\16r\u0462\13r\3r\3"+
"\fs\16s\u0464\13s\3s\3s\3t\3t\3u\3u\3v\3v\7v\u046e\nv\fv\16v\u0471\13"+ "r\3s\3s\7s\u0468\ns\fs\16s\u046b\13s\3s\3s\3t\3t\3u\3u\3v\3v\7v\u0475"+
"v\3v\6v\u0474\nv\rv\16v\u0475\3v\3v\3w\6w\u047b\nw\rw\16w\u047c\3w\3w"+ "\nv\fv\16v\u0478\13v\3v\6v\u047b\nv\rv\16v\u047c\3v\3v\3w\3w\3w\3w\7w"+
"\3x\3x\3x\3x\7x\u0485\nx\fx\16x\u0488\13x\3x\3x\3y\3y\3y\3y\7y\u0490\n"+ "\u0485\nw\fw\16w\u0488\13w\3w\3w\3w\3x\6x\u048e\nx\rx\16x\u048f\3x\3x"+
"y\fy\16y\u0493\13y\3y\3y\3y\3y\3y\4\u0394\u0491\2z\3\3\5\4\7\5\t\6\13"+ "\3y\3y\3y\3y\7y\u0498\ny\fy\16y\u049b\13y\3y\3y\3z\3z\3z\3z\7z\u04a3\n"+
"z\fz\16z\u04a6\13z\3z\3z\3z\3z\3z\4\u0486\u04a4\2{\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\'"+ "\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\'"+ "\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>{?}@\177"+ "M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177"+
@ -259,354 +309,360 @@ public class KickCLexer extends Lexer {
"U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb"+ "U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb"+
"_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cf"+ "_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cf"+
"i\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd\2\u00df\2\u00e1\2\u00e3"+ "i\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd\2\u00df\2\u00e1\2\u00e3"+
"p\u00e5q\u00e7\2\u00e9\2\u00ebr\u00eds\u00eft\u00f1u\3\2\23\3\2$$\3\2"+ "p\u00e5q\u00e7\2\u00e9\2\u00ebr\u00eds\u00eft\u00f1u\u00f3v\3\2\23\3\2"+
"||\4\2rruu\4\2ooww\7\2$$))hhpptt\3\2))\4\2uuww\7\2dfkknnuuyy\4\2DDdd\3"+ "$$\3\2||\4\2rruu\4\2ooww\7\2$$))hhpptt\3\2))\4\2uuww\7\2dfkknnuuyy\4\2"+
"\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\6\2\13"+ "DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\6"+
"\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u050c\2\3\3\2\2\2\2\5\3\2\2\2"+ "\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u0521\2\3\3\2\2\2\2\5\3"+
"\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\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"+
"\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"+ "\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\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\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\'"+
"\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"+ "\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"+
"\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"+ "\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"+
"\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\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\2I\3\2\2\2\2K\3"+
"\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"+ "\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"+
"\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\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\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"+ "e\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"+
"\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"+ "\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"+
"\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\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"+
"\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\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2"+
"\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\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"+
"\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\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2"+
"\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\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"+
"\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\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2"+
"\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\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"+
"\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\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2"+
"\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\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"+
"\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\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2"+
"\3\2\2\2\2\u00db\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00eb\3\2\2"+ "\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00eb"+
"\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\3\u00f3\3\2\2\2\5\u00fa"+ "\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"+
"\3\2\2\2\7\u00fc\3\2\2\2\t\u0104\3\2\2\2\13\u0106\3\2\2\2\r\u0108\3\2"+ "\2\3\u00f5\3\2\2\2\5\u00f7\3\2\2\2\7\u00ff\3\2\2\2\t\u0101\3\2\2\2\13"+
"\2\2\17\u010a\3\2\2\2\21\u010c\3\2\2\2\23\u010e\3\2\2\2\25\u0110\3\2\2"+ "\u0103\3\2\2\2\r\u0105\3\2\2\2\17\u0107\3\2\2\2\21\u0109\3\2\2\2\23\u010b"+
"\2\27\u0118\3\2\2\2\31\u0120\3\2\2\2\33\u0129\3\2\2\2\35\u012c\3\2\2\2"+ "\3\2\2\2\25\u0113\3\2\2\2\27\u011b\3\2\2\2\31\u0124\3\2\2\2\33\u0127\3"+
"\37\u0130\3\2\2\2!\u0137\3\2\2\2#\u013f\3\2\2\2%\u0144\3\2\2\2\'\u014d"+ "\2\2\2\35\u012b\3\2\2\2\37\u0132\3\2\2\2!\u013a\3\2\2\2#\u013f\3\2\2\2"+
"\3\2\2\2)\u0156\3\2\2\2+\u015f\3\2\2\2-\u0169\3\2\2\2/\u016f\3\2\2\2\61"+ "%\u0148\3\2\2\2\'\u0151\3\2\2\2)\u015a\3\2\2\2+\u0164\3\2\2\2-\u016a\3"+
"\u0176\3\2\2\2\63\u017d\3\2\2\2\65\u0183\3\2\2\2\67\u018c\3\2\2\29\u0193"+ "\2\2\2/\u0171\3\2\2\2\61\u0178\3\2\2\2\63\u017e\3\2\2\2\65\u0187\3\2\2"+
"\3\2\2\2;\u019c\3\2\2\2=\u01a6\3\2\2\2?\u01a9\3\2\2\2A\u01ae\3\2\2\2C"+ "\2\67\u018e\3\2\2\29\u0197\3\2\2\2;\u01a1\3\2\2\2=\u01a4\3\2\2\2?\u01a9"+
"\u01b4\3\2\2\2E\u01b7\3\2\2\2G\u01bb\3\2\2\2I\u01c2\3\2\2\2K\u01c9\3\2"+ "\3\2\2\2A\u01af\3\2\2\2C\u01b2\3\2\2\2E\u01b6\3\2\2\2G\u01bd\3\2\2\2I"+
"\2\2M\u01cf\3\2\2\2O\u01d8\3\2\2\2Q\u01dc\3\2\2\2S\u01e5\3\2\2\2U\u01ea"+ "\u01c4\3\2\2\2K\u01ca\3\2\2\2M\u01d3\3\2\2\2O\u01d7\3\2\2\2Q\u01e0\3\2"+
"\3\2\2\2W\u01ec\3\2\2\2Y\u01ef\3\2\2\2[\u01f6\3\2\2\2]\u01ff\3\2\2\2_"+ "\2\2S\u01e5\3\2\2\2U\u01e7\3\2\2\2W\u01ea\3\2\2\2Y\u01f1\3\2\2\2[\u01fa"+
"\u0201\3\2\2\2a\u0203\3\2\2\2c\u0205\3\2\2\2e\u020c\3\2\2\2g\u0211\3\2"+ "\3\2\2\2]\u01fc\3\2\2\2_\u01fe\3\2\2\2a\u0200\3\2\2\2c\u0207\3\2\2\2e"+
"\2\2i\u0213\3\2\2\2k\u0216\3\2\2\2m\u021d\3\2\2\2o\u0224\3\2\2\2q\u0227"+ "\u020c\3\2\2\2g\u020e\3\2\2\2i\u0211\3\2\2\2k\u0218\3\2\2\2m\u021f\3\2"+
"\3\2\2\2s\u022a\3\2\2\2u\u022c\3\2\2\2w\u022e\3\2\2\2y\u0230\3\2\2\2{"+ "\2\2o\u0222\3\2\2\2q\u0225\3\2\2\2s\u0227\3\2\2\2u\u0229\3\2\2\2w\u022b"+
"\u0232\3\2\2\2}\u0234\3\2\2\2\177\u0237\3\2\2\2\u0081\u023a\3\2\2\2\u0083"+ "\3\2\2\2y\u022d\3\2\2\2{\u022f\3\2\2\2}\u0232\3\2\2\2\177\u0235\3\2\2"+
"\u023c\3\2\2\2\u0085\u023e\3\2\2\2\u0087\u0240\3\2\2\2\u0089\u0242\3\2"+ "\2\u0081\u0237\3\2\2\2\u0083\u0239\3\2\2\2\u0085\u023b\3\2\2\2\u0087\u023d"+
"\2\2\u008b\u0245\3\2\2\2\u008d\u0248\3\2\2\2\u008f\u024b\3\2\2\2\u0091"+ "\3\2\2\2\u0089\u0240\3\2\2\2\u008b\u0243\3\2\2\2\u008d\u0246\3\2\2\2\u008f"+
"\u024e\3\2\2\2\u0093\u0250\3\2\2\2\u0095\u0252\3\2\2\2\u0097\u0255\3\2"+ "\u0249\3\2\2\2\u0091\u024b\3\2\2\2\u0093\u024d\3\2\2\2\u0095\u0250\3\2"+
"\2\2\u0099\u0258\3\2\2\2\u009b\u025a\3\2\2\2\u009d\u025d\3\2\2\2\u009f"+ "\2\2\u0097\u0253\3\2\2\2\u0099\u0255\3\2\2\2\u009b\u0258\3\2\2\2\u009d"+
"\u0260\3\2\2\2\u00a1\u0263\3\2\2\2\u00a3\u0266\3\2\2\2\u00a5\u0269\3\2"+ "\u025b\3\2\2\2\u009f\u025e\3\2\2\2\u00a1\u0261\3\2\2\2\u00a3\u0264\3\2"+
"\2\2\u00a7\u026d\3\2\2\2\u00a9\u0271\3\2\2\2\u00ab\u0274\3\2\2\2\u00ad"+ "\2\2\u00a5\u0268\3\2\2\2\u00a7\u026c\3\2\2\2\u00a9\u026f\3\2\2\2\u00ab"+
"\u0277\3\2\2\2\u00af\u027a\3\2\2\2\u00b1\u0282\3\2\2\2\u00b3\u028b\3\2"+ "\u0272\3\2\2\2\u00ad\u0275\3\2\2\2\u00af\u027d\3\2\2\2\u00b1\u0286\3\2"+
"\2\2\u00b5\u0290\3\2\2\2\u00b7\u0299\3\2\2\2\u00b9\u029f\3\2\2\2\u00bb"+ "\2\2\u00b3\u028b\3\2\2\2\u00b5\u0294\3\2\2\2\u00b7\u029a\3\2\2\2\u00b9"+
"\u02a6\3\2\2\2\u00bd\u02ac\3\2\2\2\u00bf\u038c\3\2\2\2\u00c1\u038e\3\2"+ "\u02a1\3\2\2\2\u00bb\u02a7\3\2\2\2\u00bd\u0387\3\2\2\2\u00bf\u0389\3\2"+
"\2\2\u00c3\u03bf\3\2\2\2\u00c5\u03c1\3\2\2\2\u00c7\u03d7\3\2\2\2\u00c9"+ "\2\2\u00c1\u0392\3\2\2\2\u00c3\u03c4\3\2\2\2\u00c5\u03c6\3\2\2\2\u00c7"+
"\u03e8\3\2\2\2\u00cb\u03ec\3\2\2\2\u00cd\u03f1\3\2\2\2\u00cf\u03f8\3\2"+ "\u03de\3\2\2\2\u00c9\u03ef\3\2\2\2\u00cb\u03f3\3\2\2\2\u00cd\u03f8\3\2"+
"\2\2\u00d1\u0409\3\2\2\2\u00d3\u0417\3\2\2\2\u00d5\u0428\3\2\2\2\u00d7"+ "\2\2\u00cf\u03ff\3\2\2\2\u00d1\u0410\3\2\2\2\u00d3\u041e\3\2\2\2\u00d5"+
"\u043c\3\2\2\2\u00d9\u043f\3\2\2\2\u00db\u0448\3\2\2\2\u00dd\u044f\3\2"+ "\u042f\3\2\2\2\u00d7\u0443\3\2\2\2\u00d9\u0446\3\2\2\2\u00db\u044f\3\2"+
"\2\2\u00df\u0451\3\2\2\2\u00e1\u0453\3\2\2\2\u00e3\u0455\3\2\2\2\u00e5"+ "\2\2\u00dd\u0456\3\2\2\2\u00df\u0458\3\2\2\2\u00e1\u045a\3\2\2\2\u00e3"+
"\u045e\3\2\2\2\u00e7\u0467\3\2\2\2\u00e9\u0469\3\2\2\2\u00eb\u046b\3\2"+ "\u045c\3\2\2\2\u00e5\u0465\3\2\2\2\u00e7\u046e\3\2\2\2\u00e9\u0470\3\2"+
"\2\2\u00ed\u047a\3\2\2\2\u00ef\u0480\3\2\2\2\u00f1\u048b\3\2\2\2\u00f3"+ "\2\2\u00eb\u0472\3\2\2\2\u00ed\u0480\3\2\2\2\u00ef\u048d\3\2\2\2\u00f1"+
"\u00f4\7k\2\2\u00f4\u00f5\7o\2\2\u00f5\u00f6\7r\2\2\u00f6\u00f7\7q\2\2"+ "\u0493\3\2\2\2\u00f3\u049e\3\2\2\2\u00f5\u00f6\7=\2\2\u00f6\4\3\2\2\2"+
"\u00f7\u00f8\7t\2\2\u00f8\u00f9\7v\2\2\u00f9\4\3\2\2\2\u00fa\u00fb\7="+ "\u00f7\u00f8\7v\2\2\u00f8\u00f9\7{\2\2\u00f9\u00fa\7r\2\2\u00fa\u00fb"+
"\2\2\u00fb\6\3\2\2\2\u00fc\u00fd\7v\2\2\u00fd\u00fe\7{\2\2\u00fe\u00ff"+ "\7g\2\2\u00fb\u00fc\7f\2\2\u00fc\u00fd\7g\2\2\u00fd\u00fe\7h\2\2\u00fe"+
"\7r\2\2\u00ff\u0100\7g\2\2\u0100\u0101\7f\2\2\u0101\u0102\7g\2\2\u0102"+ "\6\3\2\2\2\u00ff\u0100\7.\2\2\u0100\b\3\2\2\2\u0101\u0102\7?\2\2\u0102"+
"\u0103\7h\2\2\u0103\b\3\2\2\2\u0104\u0105\7.\2\2\u0105\n\3\2\2\2\u0106"+ "\n\3\2\2\2\u0103\u0104\7*\2\2\u0104\f\3\2\2\2\u0105\u0106\7+\2\2\u0106"+
"\u0107\7?\2\2\u0107\f\3\2\2\2\u0108\u0109\7*\2\2\u0109\16\3\2\2\2\u010a"+ "\16\3\2\2\2\u0107\u0108\7}\2\2\u0108\20\3\2\2\2\u0109\u010a\7\177\2\2"+
"\u010b\7+\2\2\u010b\20\3\2\2\2\u010c\u010d\7}\2\2\u010d\22\3\2\2\2\u010e"+ "\u010a\22\3\2\2\2\u010b\u010c\7%\2\2\u010c\u010d\7r\2\2\u010d\u010e\7"+
"\u010f\7\177\2\2\u010f\24\3\2\2\2\u0110\u0111\7%\2\2\u0111\u0112\7r\2"+ "t\2\2\u010e\u010f\7c\2\2\u010f\u0110\7i\2\2\u0110\u0111\7o\2\2\u0111\u0112"+
"\2\u0112\u0113\7t\2\2\u0113\u0114\7c\2\2\u0114\u0115\7i\2\2\u0115\u0116"+ "\7c\2\2\u0112\24\3\2\2\2\u0113\u0114\7t\2\2\u0114\u0115\7g\2\2\u0115\u0116"+
"\7o\2\2\u0116\u0117\7c\2\2\u0117\26\3\2\2\2\u0118\u0119\7t\2\2\u0119\u011a"+ "\7u\2\2\u0116\u0117\7g\2\2\u0117\u0118\7t\2\2\u0118\u0119\7x\2\2\u0119"+
"\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7g\2\2\u011c\u011d\7t\2\2\u011d"+ "\u011a\7g\2\2\u011a\26\3\2\2\2\u011b\u011c\7%\2\2\u011c\u011d\7t\2\2\u011d"+
"\u011e\7x\2\2\u011e\u011f\7g\2\2\u011f\30\3\2\2\2\u0120\u0121\7%\2\2\u0121"+ "\u011e\7g\2\2\u011e\u011f\7u\2\2\u011f\u0120\7g\2\2\u0120\u0121\7t\2\2"+
"\u0122\7t\2\2\u0122\u0123\7g\2\2\u0123\u0124\7u\2\2\u0124\u0125\7g\2\2"+ "\u0121\u0122\7x\2\2\u0122\u0123\7g\2\2\u0123\30\3\2\2\2\u0124\u0125\7"+
"\u0125\u0126\7t\2\2\u0126\u0127\7x\2\2\u0127\u0128\7g\2\2\u0128\32\3\2"+ "r\2\2\u0125\u0126\7e\2\2\u0126\32\3\2\2\2\u0127\u0128\7%\2\2\u0128\u0129"+
"\2\2\u0129\u012a\7r\2\2\u012a\u012b\7e\2\2\u012b\34\3\2\2\2\u012c\u012d"+ "\7r\2\2\u0129\u012a\7e\2\2\u012a\34\3\2\2\2\u012b\u012c\7v\2\2\u012c\u012d"+
"\7%\2\2\u012d\u012e\7r\2\2\u012e\u012f\7e\2\2\u012f\36\3\2\2\2\u0130\u0131"+ "\7c\2\2\u012d\u012e\7t\2\2\u012e\u012f\7i\2\2\u012f\u0130\7g\2\2\u0130"+
"\7v\2\2\u0131\u0132\7c\2\2\u0132\u0133\7t\2\2\u0133\u0134\7i\2\2\u0134"+ "\u0131\7v\2\2\u0131\36\3\2\2\2\u0132\u0133\7%\2\2\u0133\u0134\7v\2\2\u0134"+
"\u0135\7g\2\2\u0135\u0136\7v\2\2\u0136 \3\2\2\2\u0137\u0138\7%\2\2\u0138"+ "\u0135\7c\2\2\u0135\u0136\7t\2\2\u0136\u0137\7i\2\2\u0137\u0138\7g\2\2"+
"\u0139\7v\2\2\u0139\u013a\7c\2\2\u013a\u013b\7t\2\2\u013b\u013c\7i\2\2"+ "\u0138\u0139\7v\2\2\u0139 \3\2\2\2\u013a\u013b\7n\2\2\u013b\u013c\7k\2"+
"\u013c\u013d\7g\2\2\u013d\u013e\7v\2\2\u013e\"\3\2\2\2\u013f\u0140\7n"+ "\2\u013c\u013d\7p\2\2\u013d\u013e\7m\2\2\u013e\"\3\2\2\2\u013f\u0140\7"+
"\2\2\u0140\u0141\7k\2\2\u0141\u0142\7p\2\2\u0142\u0143\7m\2\2\u0143$\3"+ "e\2\2\u0140\u0141\7q\2\2\u0141\u0142\7f\2\2\u0142\u0143\7g\2\2\u0143\u0144"+
"\2\2\2\u0144\u0145\7e\2\2\u0145\u0146\7q\2\2\u0146\u0147\7f\2\2\u0147"+ "\7a\2\2\u0144\u0145\7u\2\2\u0145\u0146\7g\2\2\u0146\u0147\7i\2\2\u0147"+
"\u0148\7g\2\2\u0148\u0149\7a\2\2\u0149\u014a\7u\2\2\u014a\u014b\7g\2\2"+ "$\3\2\2\2\u0148\u0149\7f\2\2\u0149\u014a\7c\2\2\u014a\u014b\7v\2\2\u014b"+
"\u014b\u014c\7i\2\2\u014c&\3\2\2\2\u014d\u014e\7f\2\2\u014e\u014f\7c\2"+ "\u014c\7c\2\2\u014c\u014d\7a\2\2\u014d\u014e\7u\2\2\u014e\u014f\7g\2\2"+
"\2\u014f\u0150\7v\2\2\u0150\u0151\7c\2\2\u0151\u0152\7a\2\2\u0152\u0153"+ "\u014f\u0150\7i\2\2\u0150&\3\2\2\2\u0151\u0152\7g\2\2\u0152\u0153\7p\2"+
"\7u\2\2\u0153\u0154\7g\2\2\u0154\u0155\7i\2\2\u0155(\3\2\2\2\u0156\u0157"+ "\2\u0153\u0154\7e\2\2\u0154\u0155\7q\2\2\u0155\u0156\7f\2\2\u0156\u0157"+
"\7g\2\2\u0157\u0158\7p\2\2\u0158\u0159\7e\2\2\u0159\u015a\7q\2\2\u015a"+ "\7k\2\2\u0157\u0158\7p\2\2\u0158\u0159\7i\2\2\u0159(\3\2\2\2\u015a\u015b"+
"\u015b\7f\2\2\u015b\u015c\7k\2\2\u015c\u015d\7p\2\2\u015d\u015e\7i\2\2"+ "\7%\2\2\u015b\u015c\7g\2\2\u015c\u015d\7p\2\2\u015d\u015e\7e\2\2\u015e"+
"\u015e*\3\2\2\2\u015f\u0160\7%\2\2\u0160\u0161\7g\2\2\u0161\u0162\7p\2"+ "\u015f\7q\2\2\u015f\u0160\7f\2\2\u0160\u0161\7k\2\2\u0161\u0162\7p\2\2"+
"\2\u0162\u0163\7e\2\2\u0163\u0164\7q\2\2\u0164\u0165\7f\2\2\u0165\u0166"+ "\u0162\u0163\7i\2\2\u0163*\3\2\2\2\u0164\u0165\7e\2\2\u0165\u0166\7q\2"+
"\7k\2\2\u0166\u0167\7p\2\2\u0167\u0168\7i\2\2\u0168,\3\2\2\2\u0169\u016a"+ "\2\u0166\u0167\7p\2\2\u0167\u0168\7u\2\2\u0168\u0169\7v\2\2\u0169,\3\2"+
"\7e\2\2\u016a\u016b\7q\2\2\u016b\u016c\7p\2\2\u016c\u016d\7u\2\2\u016d"+ "\2\2\u016a\u016b\7g\2\2\u016b\u016c\7z\2\2\u016c\u016d\7v\2\2\u016d\u016e"+
"\u016e\7v\2\2\u016e.\3\2\2\2\u016f\u0170\7g\2\2\u0170\u0171\7z\2\2\u0171"+ "\7g\2\2\u016e\u016f\7t\2\2\u016f\u0170\7p\2\2\u0170.\3\2\2\2\u0171\u0172"+
"\u0172\7v\2\2\u0172\u0173\7g\2\2\u0173\u0174\7t\2\2\u0174\u0175\7p\2\2"+ "\7g\2\2\u0172\u0173\7z\2\2\u0173\u0174\7r\2\2\u0174\u0175\7q\2\2\u0175"+
"\u0175\60\3\2\2\2\u0176\u0177\7g\2\2\u0177\u0178\7z\2\2\u0178\u0179\7"+ "\u0176\7t\2\2\u0176\u0177\7v\2\2\u0177\60\3\2\2\2\u0178\u0179\7c\2\2\u0179"+
"r\2\2\u0179\u017a\7q\2\2\u017a\u017b\7t\2\2\u017b\u017c\7v\2\2\u017c\62"+ "\u017a\7n\2\2\u017a\u017b\7k\2\2\u017b\u017c\7i\2\2\u017c\u017d\7p\2\2"+
"\3\2\2\2\u017d\u017e\7c\2\2\u017e\u017f\7n\2\2\u017f\u0180\7k\2\2\u0180"+ "\u017d\62\3\2\2\2\u017e\u017f\7t\2\2\u017f\u0180\7g\2\2\u0180\u0181\7"+
"\u0181\7i\2\2\u0181\u0182\7p\2\2\u0182\64\3\2\2\2\u0183\u0184\7t\2\2\u0184"+ "i\2\2\u0181\u0182\7k\2\2\u0182\u0183\7u\2\2\u0183\u0184\7v\2\2\u0184\u0185"+
"\u0185\7g\2\2\u0185\u0186\7i\2\2\u0186\u0187\7k\2\2\u0187\u0188\7u\2\2"+ "\7g\2\2\u0185\u0186\7t\2\2\u0186\64\3\2\2\2\u0187\u0188\7k\2\2\u0188\u0189"+
"\u0188\u0189\7v\2\2\u0189\u018a\7g\2\2\u018a\u018b\7t\2\2\u018b\66\3\2"+ "\7p\2\2\u0189\u018a\7n\2\2\u018a\u018b\7k\2\2\u018b\u018c\7p\2\2\u018c"+
"\2\2\u018c\u018d\7k\2\2\u018d\u018e\7p\2\2\u018e\u018f\7n\2\2\u018f\u0190"+ "\u018d\7g\2\2\u018d\66\3\2\2\2\u018e\u018f\7x\2\2\u018f\u0190\7q\2\2\u0190"+
"\7k\2\2\u0190\u0191\7p\2\2\u0191\u0192\7g\2\2\u01928\3\2\2\2\u0193\u0194"+ "\u0191\7n\2\2\u0191\u0192\7c\2\2\u0192\u0193\7v\2\2\u0193\u0194\7k\2\2"+
"\7x\2\2\u0194\u0195\7q\2\2\u0195\u0196\7n\2\2\u0196\u0197\7c\2\2\u0197"+ "\u0194\u0195\7n\2\2\u0195\u0196\7g\2\2\u01968\3\2\2\2\u0197\u0198\7k\2"+
"\u0198\7v\2\2\u0198\u0199\7k\2\2\u0199\u019a\7n\2\2\u019a\u019b\7g\2\2"+ "\2\u0198\u0199\7p\2\2\u0199\u019a\7v\2\2\u019a\u019b\7g\2\2\u019b\u019c"+
"\u019b:\3\2\2\2\u019c\u019d\7k\2\2\u019d\u019e\7p\2\2\u019e\u019f\7v\2"+ "\7t\2\2\u019c\u019d\7t\2\2\u019d\u019e\7w\2\2\u019e\u019f\7r\2\2\u019f"+
"\2\u019f\u01a0\7g\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7t\2\2\u01a2\u01a3"+ "\u01a0\7v\2\2\u01a0:\3\2\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7h\2\2\u01a3"+
"\7w\2\2\u01a3\u01a4\7r\2\2\u01a4\u01a5\7v\2\2\u01a5<\3\2\2\2\u01a6\u01a7"+ "<\3\2\2\2\u01a4\u01a5\7g\2\2\u01a5\u01a6\7n\2\2\u01a6\u01a7\7u\2\2\u01a7"+
"\7k\2\2\u01a7\u01a8\7h\2\2\u01a8>\3\2\2\2\u01a9\u01aa\7g\2\2\u01aa\u01ab"+ "\u01a8\7g\2\2\u01a8>\3\2\2\2\u01a9\u01aa\7y\2\2\u01aa\u01ab\7j\2\2\u01ab"+
"\7n\2\2\u01ab\u01ac\7u\2\2\u01ac\u01ad\7g\2\2\u01ad@\3\2\2\2\u01ae\u01af"+ "\u01ac\7k\2\2\u01ac\u01ad\7n\2\2\u01ad\u01ae\7g\2\2\u01ae@\3\2\2\2\u01af"+
"\7y\2\2\u01af\u01b0\7j\2\2\u01b0\u01b1\7k\2\2\u01b1\u01b2\7n\2\2\u01b2"+ "\u01b0\7f\2\2\u01b0\u01b1\7q\2\2\u01b1B\3\2\2\2\u01b2\u01b3\7h\2\2\u01b3"+
"\u01b3\7g\2\2\u01b3B\3\2\2\2\u01b4\u01b5\7f\2\2\u01b5\u01b6\7q\2\2\u01b6"+ "\u01b4\7q\2\2\u01b4\u01b5\7t\2\2\u01b5D\3\2\2\2\u01b6\u01b7\7u\2\2\u01b7"+
"D\3\2\2\2\u01b7\u01b8\7h\2\2\u01b8\u01b9\7q\2\2\u01b9\u01ba\7t\2\2\u01ba"+ "\u01b8\7y\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7v\2\2\u01ba\u01bb\7e\2\2"+
"F\3\2\2\2\u01bb\u01bc\7u\2\2\u01bc\u01bd\7y\2\2\u01bd\u01be\7k\2\2\u01be"+ "\u01bb\u01bc\7j\2\2\u01bcF\3\2\2\2\u01bd\u01be\7t\2\2\u01be\u01bf\7g\2"+
"\u01bf\7v\2\2\u01bf\u01c0\7e\2\2\u01c0\u01c1\7j\2\2\u01c1H\3\2\2\2\u01c2"+ "\2\u01bf\u01c0\7v\2\2\u01c0\u01c1\7w\2\2\u01c1\u01c2\7t\2\2\u01c2\u01c3"+
"\u01c3\7t\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7v\2\2\u01c5\u01c6\7w\2\2"+ "\7p\2\2\u01c3H\3\2\2\2\u01c4\u01c5\7d\2\2\u01c5\u01c6\7t\2\2\u01c6\u01c7"+
"\u01c6\u01c7\7t\2\2\u01c7\u01c8\7p\2\2\u01c8J\3\2\2\2\u01c9\u01ca\7d\2"+ "\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7m\2\2\u01c9J\3\2\2\2\u01ca\u01cb"+
"\2\u01ca\u01cb\7t\2\2\u01cb\u01cc\7g\2\2\u01cc\u01cd\7c\2\2\u01cd\u01ce"+ "\7e\2\2\u01cb\u01cc\7q\2\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7v\2\2\u01ce"+
"\7m\2\2\u01ceL\3\2\2\2\u01cf\u01d0\7e\2\2\u01d0\u01d1\7q\2\2\u01d1\u01d2"+ "\u01cf\7k\2\2\u01cf\u01d0\7p\2\2\u01d0\u01d1\7w\2\2\u01d1\u01d2\7g\2\2"+
"\7p\2\2\u01d2\u01d3\7v\2\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7p\2\2\u01d5"+ "\u01d2L\3\2\2\2\u01d3\u01d4\7c\2\2\u01d4\u01d5\7u\2\2\u01d5\u01d6\7o\2"+
"\u01d6\7w\2\2\u01d6\u01d7\7g\2\2\u01d7N\3\2\2\2\u01d8\u01d9\7c\2\2\u01d9"+ "\2\u01d6N\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\u01d9\7g\2\2\u01d9\u01da\7"+
"\u01da\7u\2\2\u01da\u01db\7o\2\2\u01dbP\3\2\2\2\u01dc\u01dd\7f\2\2\u01dd"+ "h\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7w\2\2\u01dc\u01dd\7n\2\2\u01dd\u01de"+
"\u01de\7g\2\2\u01de\u01df\7h\2\2\u01df\u01e0\7c\2\2\u01e0\u01e1\7w\2\2"+ "\7v\2\2\u01de\u01df\7<\2\2\u01dfP\3\2\2\2\u01e0\u01e1\7e\2\2\u01e1\u01e2"+
"\u01e1\u01e2\7n\2\2\u01e2\u01e3\7v\2\2\u01e3\u01e4\7<\2\2\u01e4R\3\2\2"+ "\7c\2\2\u01e2\u01e3\7u\2\2\u01e3\u01e4\7g\2\2\u01e4R\3\2\2\2\u01e5\u01e6"+
"\2\u01e5\u01e6\7e\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7u\2\2\u01e8\u01e9"+ "\7<\2\2\u01e6T\3\2\2\2\u01e7\u01e8\7\60\2\2\u01e8\u01e9\7\60\2\2\u01e9"+
"\7g\2\2\u01e9T\3\2\2\2\u01ea\u01eb\7<\2\2\u01ebV\3\2\2\2\u01ec\u01ed\7"+ "V\3\2\2\2\u01ea\u01eb\7u\2\2\u01eb\u01ec\7k\2\2\u01ec\u01ed\7i\2\2\u01ed"+
"\60\2\2\u01ed\u01ee\7\60\2\2\u01eeX\3\2\2\2\u01ef\u01f0\7u\2\2\u01f0\u01f1"+ "\u01ee\7p\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0\7f\2\2\u01f0X\3\2\2\2\u01f1"+
"\7k\2\2\u01f1\u01f2\7i\2\2\u01f2\u01f3\7p\2\2\u01f3\u01f4\7g\2\2\u01f4"+ "\u01f2\7w\2\2\u01f2\u01f3\7p\2\2\u01f3\u01f4\7u\2\2\u01f4\u01f5\7k\2\2"+
"\u01f5\7f\2\2\u01f5Z\3\2\2\2\u01f6\u01f7\7w\2\2\u01f7\u01f8\7p\2\2\u01f8"+ "\u01f5\u01f6\7i\2\2\u01f6\u01f7\7p\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9"+
"\u01f9\7u\2\2\u01f9\u01fa\7k\2\2\u01fa\u01fb\7i\2\2\u01fb\u01fc\7p\2\2"+ "\7f\2\2\u01f9Z\3\2\2\2\u01fa\u01fb\7,\2\2\u01fb\\\3\2\2\2\u01fc\u01fd"+
"\u01fc\u01fd\7g\2\2\u01fd\u01fe\7f\2\2\u01fe\\\3\2\2\2\u01ff\u0200\7,"+ "\7]\2\2\u01fd^\3\2\2\2\u01fe\u01ff\7_\2\2\u01ff`\3\2\2\2\u0200\u0201\7"+
"\2\2\u0200^\3\2\2\2\u0201\u0202\7]\2\2\u0202`\3\2\2\2\u0203\u0204\7_\2"+ "u\2\2\u0201\u0202\7v\2\2\u0202\u0203\7t\2\2\u0203\u0204\7w\2\2\u0204\u0205"+
"\2\u0204b\3\2\2\2\u0205\u0206\7u\2\2\u0206\u0207\7v\2\2\u0207\u0208\7"+ "\7e\2\2\u0205\u0206\7v\2\2\u0206b\3\2\2\2\u0207\u0208\7g\2\2\u0208\u0209"+
"t\2\2\u0208\u0209\7w\2\2\u0209\u020a\7e\2\2\u020a\u020b\7v\2\2\u020bd"+ "\7p\2\2\u0209\u020a\7w\2\2\u020a\u020b\7o\2\2\u020bd\3\2\2\2\u020c\u020d"+
"\3\2\2\2\u020c\u020d\7g\2\2\u020d\u020e\7p\2\2\u020e\u020f\7w\2\2\u020f"+ "\7\60\2\2\u020df\3\2\2\2\u020e\u020f\7/\2\2\u020f\u0210\7@\2\2\u0210h"+
"\u0210\7o\2\2\u0210f\3\2\2\2\u0211\u0212\7\60\2\2\u0212h\3\2\2\2\u0213"+ "\3\2\2\2\u0211\u0212\7u\2\2\u0212\u0213\7k\2\2\u0213\u0214\7|\2\2\u0214"+
"\u0214\7/\2\2\u0214\u0215\7@\2\2\u0215j\3\2\2\2\u0216\u0217\7u\2\2\u0217"+ "\u0215\7g\2\2\u0215\u0216\7q\2\2\u0216\u0217\7h\2\2\u0217j\3\2\2\2\u0218"+
"\u0218\7k\2\2\u0218\u0219\7|\2\2\u0219\u021a\7g\2\2\u021a\u021b\7q\2\2"+ "\u0219\7v\2\2\u0219\u021a\7{\2\2\u021a\u021b\7r\2\2\u021b\u021c\7g\2\2"+
"\u021b\u021c\7h\2\2\u021cl\3\2\2\2\u021d\u021e\7v\2\2\u021e\u021f\7{\2"+ "\u021c\u021d\7k\2\2\u021d\u021e\7f\2\2\u021el\3\2\2\2\u021f\u0220\7/\2"+
"\2\u021f\u0220\7r\2\2\u0220\u0221\7g\2\2\u0221\u0222\7k\2\2\u0222\u0223"+ "\2\u0220\u0221\7/\2\2\u0221n\3\2\2\2\u0222\u0223\7-\2\2\u0223\u0224\7"+
"\7f\2\2\u0223n\3\2\2\2\u0224\u0225\7/\2\2\u0225\u0226\7/\2\2\u0226p\3"+ "-\2\2\u0224p\3\2\2\2\u0225\u0226\7-\2\2\u0226r\3\2\2\2\u0227\u0228\7/"+
"\2\2\2\u0227\u0228\7-\2\2\u0228\u0229\7-\2\2\u0229r\3\2\2\2\u022a\u022b"+ "\2\2\u0228t\3\2\2\2\u0229\u022a\7#\2\2\u022av\3\2\2\2\u022b\u022c\7(\2"+
"\7-\2\2\u022bt\3\2\2\2\u022c\u022d\7/\2\2\u022dv\3\2\2\2\u022e\u022f\7"+ "\2\u022cx\3\2\2\2\u022d\u022e\7\u0080\2\2\u022ez\3\2\2\2\u022f\u0230\7"+
"#\2\2\u022fx\3\2\2\2\u0230\u0231\7(\2\2\u0231z\3\2\2\2\u0232\u0233\7\u0080"+ "@\2\2\u0230\u0231\7@\2\2\u0231|\3\2\2\2\u0232\u0233\7>\2\2\u0233\u0234"+
"\2\2\u0233|\3\2\2\2\u0234\u0235\7@\2\2\u0235\u0236\7@\2\2\u0236~\3\2\2"+ "\7>\2\2\u0234~\3\2\2\2\u0235\u0236\7\61\2\2\u0236\u0080\3\2\2\2\u0237"+
"\2\u0237\u0238\7>\2\2\u0238\u0239\7>\2\2\u0239\u0080\3\2\2\2\u023a\u023b"+ "\u0238\7\'\2\2\u0238\u0082\3\2\2\2\u0239\u023a\7>\2\2\u023a\u0084\3\2"+
"\7\61\2\2\u023b\u0082\3\2\2\2\u023c\u023d\7\'\2\2\u023d\u0084\3\2\2\2"+ "\2\2\u023b\u023c\7@\2\2\u023c\u0086\3\2\2\2\u023d\u023e\7?\2\2\u023e\u023f"+
"\u023e\u023f\7>\2\2\u023f\u0086\3\2\2\2\u0240\u0241\7@\2\2\u0241\u0088"+ "\7?\2\2\u023f\u0088\3\2\2\2\u0240\u0241\7#\2\2\u0241\u0242\7?\2\2\u0242"+
"\3\2\2\2\u0242\u0243\7?\2\2\u0243\u0244\7?\2\2\u0244\u008a\3\2\2\2\u0245"+ "\u008a\3\2\2\2\u0243\u0244\7>\2\2\u0244\u0245\7?\2\2\u0245\u008c\3\2\2"+
"\u0246\7#\2\2\u0246\u0247\7?\2\2\u0247\u008c\3\2\2\2\u0248\u0249\7>\2"+ "\2\u0246\u0247\7@\2\2\u0247\u0248\7?\2\2\u0248\u008e\3\2\2\2\u0249\u024a"+
"\2\u0249\u024a\7?\2\2\u024a\u008e\3\2\2\2\u024b\u024c\7@\2\2\u024c\u024d"+ "\7`\2\2\u024a\u0090\3\2\2\2\u024b\u024c\7~\2\2\u024c\u0092\3\2\2\2\u024d"+
"\7?\2\2\u024d\u0090\3\2\2\2\u024e\u024f\7`\2\2\u024f\u0092\3\2\2\2\u0250"+ "\u024e\7(\2\2\u024e\u024f\7(\2\2\u024f\u0094\3\2\2\2\u0250\u0251\7~\2"+
"\u0251\7~\2\2\u0251\u0094\3\2\2\2\u0252\u0253\7(\2\2\u0253\u0254\7(\2"+ "\2\u0251\u0252\7~\2\2\u0252\u0096\3\2\2\2\u0253\u0254\7A\2\2\u0254\u0098"+
"\2\u0254\u0096\3\2\2\2\u0255\u0256\7~\2\2\u0256\u0257\7~\2\2\u0257\u0098"+ "\3\2\2\2\u0255\u0256\7-\2\2\u0256\u0257\7?\2\2\u0257\u009a\3\2\2\2\u0258"+
"\3\2\2\2\u0258\u0259\7A\2\2\u0259\u009a\3\2\2\2\u025a\u025b\7-\2\2\u025b"+ "\u0259\7/\2\2\u0259\u025a\7?\2\2\u025a\u009c\3\2\2\2\u025b\u025c\7,\2"+
"\u025c\7?\2\2\u025c\u009c\3\2\2\2\u025d\u025e\7/\2\2\u025e\u025f\7?\2"+ "\2\u025c\u025d\7?\2\2\u025d\u009e\3\2\2\2\u025e\u025f\7\61\2\2\u025f\u0260"+
"\2\u025f\u009e\3\2\2\2\u0260\u0261\7,\2\2\u0261\u0262\7?\2\2\u0262\u00a0"+ "\7?\2\2\u0260\u00a0\3\2\2\2\u0261\u0262\7\'\2\2\u0262\u0263\7?\2\2\u0263"+
"\3\2\2\2\u0263\u0264\7\61\2\2\u0264\u0265\7?\2\2\u0265\u00a2\3\2\2\2\u0266"+ "\u00a2\3\2\2\2\u0264\u0265\7>\2\2\u0265\u0266\7>\2\2\u0266\u0267\7?\2"+
"\u0267\7\'\2\2\u0267\u0268\7?\2\2\u0268\u00a4\3\2\2\2\u0269\u026a\7>\2"+ "\2\u0267\u00a4\3\2\2\2\u0268\u0269\7@\2\2\u0269\u026a\7@\2\2\u026a\u026b"+
"\2\u026a\u026b\7>\2\2\u026b\u026c\7?\2\2\u026c\u00a6\3\2\2\2\u026d\u026e"+ "\7?\2\2\u026b\u00a6\3\2\2\2\u026c\u026d\7(\2\2\u026d\u026e\7?\2\2\u026e"+
"\7@\2\2\u026e\u026f\7@\2\2\u026f\u0270\7?\2\2\u0270\u00a8\3\2\2\2\u0271"+ "\u00a8\3\2\2\2\u026f\u0270\7~\2\2\u0270\u0271\7?\2\2\u0271\u00aa\3\2\2"+
"\u0272\7(\2\2\u0272\u0273\7?\2\2\u0273\u00aa\3\2\2\2\u0274\u0275\7~\2"+ "\2\u0272\u0273\7`\2\2\u0273\u0274\7?\2\2\u0274\u00ac\3\2\2\2\u0275\u0276"+
"\2\u0275\u0276\7?\2\2\u0276\u00ac\3\2\2\2\u0277\u0278\7`\2\2\u0278\u0279"+ "\7m\2\2\u0276\u0277\7k\2\2\u0277\u0278\7e\2\2\u0278\u0279\7m\2\2\u0279"+
"\7?\2\2\u0279\u00ae\3\2\2\2\u027a\u027b\7m\2\2\u027b\u027c\7k\2\2\u027c"+ "\u027a\7c\2\2\u027a\u027b\7u\2\2\u027b\u027c\7o\2\2\u027c\u00ae\3\2\2"+
"\u027d\7e\2\2\u027d\u027e\7m\2\2\u027e\u027f\7c\2\2\u027f\u0280\7u\2\2"+ "\2\u027d\u027e\7t\2\2\u027e\u027f\7g\2\2\u027f\u0280\7u\2\2\u0280\u0281"+
"\u0280\u0281\7o\2\2\u0281\u00b0\3\2\2\2\u0282\u0283\7t\2\2\u0283\u0284"+ "\7q\2\2\u0281\u0282\7w\2\2\u0282\u0283\7t\2\2\u0283\u0284\7e\2\2\u0284"+
"\7g\2\2\u0284\u0285\7u\2\2\u0285\u0286\7q\2\2\u0286\u0287\7w\2\2\u0287"+ "\u0285\7g\2\2\u0285\u00b0\3\2\2\2\u0286\u0287\7w\2\2\u0287\u0288\7u\2"+
"\u0288\7t\2\2\u0288\u0289\7e\2\2\u0289\u028a\7g\2\2\u028a\u00b2\3\2\2"+ "\2\u0288\u0289\7g\2\2\u0289\u028a\7u\2\2\u028a\u00b2\3\2\2\2\u028b\u028c"+
"\2\u028b\u028c\7w\2\2\u028c\u028d\7u\2\2\u028d\u028e\7g\2\2\u028e\u028f"+ "\7e\2\2\u028c\u028d\7n\2\2\u028d\u028e\7q\2\2\u028e\u028f\7d\2\2\u028f"+
"\7u\2\2\u028f\u00b4\3\2\2\2\u0290\u0291\7e\2\2\u0291\u0292\7n\2\2\u0292"+ "\u0290\7d\2\2\u0290\u0291\7g\2\2\u0291\u0292\7t\2\2\u0292\u0293\7u\2\2"+
"\u0293\7q\2\2\u0293\u0294\7d\2\2\u0294\u0295\7d\2\2\u0295\u0296\7g\2\2"+ "\u0293\u00b4\3\2\2\2\u0294\u0295\7d\2\2\u0295\u0296\7{\2\2\u0296\u0297"+
"\u0296\u0297\7t\2\2\u0297\u0298\7u\2\2\u0298\u00b6\3\2\2\2\u0299\u029a"+ "\7v\2\2\u0297\u0298\7g\2\2\u0298\u0299\7u\2\2\u0299\u00b6\3\2\2\2\u029a"+
"\7d\2\2\u029a\u029b\7{\2\2\u029b\u029c\7v\2\2\u029c\u029d\7g\2\2\u029d"+ "\u029b\7e\2\2\u029b\u029c\7{\2\2\u029c\u029d\7e\2\2\u029d\u029e\7n\2\2"+
"\u029e\7u\2\2\u029e\u00b8\3\2\2\2\u029f\u02a0\7e\2\2\u02a0\u02a1\7{\2"+ "\u029e\u029f\7g\2\2\u029f\u02a0\7u\2\2\u02a0\u00b8\3\2\2\2\u02a1\u02a2"+
"\2\u02a1\u02a2\7e\2\2\u02a2\u02a3\7n\2\2\u02a3\u02a4\7g\2\2\u02a4\u02a5"+ "\7\60\2\2\u02a2\u02a3\7d\2\2\u02a3\u02a4\7{\2\2\u02a4\u02a5\7v\2\2\u02a5"+
"\7u\2\2\u02a5\u00ba\3\2\2\2\u02a6\u02a7\7\60\2\2\u02a7\u02a8\7d\2\2\u02a8"+ "\u02a6\7g\2\2\u02a6\u00ba\3\2\2\2\u02a7\u02a8\7%\2\2\u02a8\u00bc\3\2\2"+
"\u02a9\7{\2\2\u02a9\u02aa\7v\2\2\u02aa\u02ab\7g\2\2\u02ab\u00bc\3\2\2"+ "\2\u02a9\u02aa\7d\2\2\u02aa\u02ab\7t\2\2\u02ab\u0388\7m\2\2\u02ac\u02ad"+
"\2\u02ac\u02ad\7%\2\2\u02ad\u00be\3\2\2\2\u02ae\u02af\7d\2\2\u02af\u02b0"+ "\7q\2\2\u02ad\u02ae\7t\2\2\u02ae\u0388\7c\2\2\u02af\u02b0\7m\2\2\u02b0"+
"\7t\2\2\u02b0\u038d\7m\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3\7t\2\2\u02b3"+ "\u02b1\7k\2\2\u02b1\u0388\7n\2\2\u02b2\u02b3\7u\2\2\u02b3\u02b4\7n\2\2"+
"\u038d\7c\2\2\u02b4\u02b5\7m\2\2\u02b5\u02b6\7k\2\2\u02b6\u038d\7n\2\2"+ "\u02b4\u0388\7q\2\2\u02b5\u02b6\7p\2\2\u02b6\u02b7\7q\2\2\u02b7\u0388"+
"\u02b7\u02b8\7u\2\2\u02b8\u02b9\7n\2\2\u02b9\u038d\7q\2\2\u02ba\u02bb"+ "\7r\2\2\u02b8\u02b9\7c\2\2\u02b9\u02ba\7u\2\2\u02ba\u0388\7n\2\2\u02bb"+
"\7p\2\2\u02bb\u02bc\7q\2\2\u02bc\u038d\7r\2\2\u02bd\u02be\7c\2\2\u02be"+ "\u02bc\7r\2\2\u02bc\u02bd\7j\2\2\u02bd\u0388\7r\2\2\u02be\u02bf\7c\2\2"+
"\u02bf\7u\2\2\u02bf\u038d\7n\2\2\u02c0\u02c1\7r\2\2\u02c1\u02c2\7j\2\2"+ "\u02bf\u02c0\7p\2\2\u02c0\u0388\7e\2\2\u02c1\u02c2\7d\2\2\u02c2\u02c3"+
"\u02c2\u038d\7r\2\2\u02c3\u02c4\7c\2\2\u02c4\u02c5\7p\2\2\u02c5\u038d"+ "\7r\2\2\u02c3\u0388\7n\2\2\u02c4\u02c5\7e\2\2\u02c5\u02c6\7n\2\2\u02c6"+
"\7e\2\2\u02c6\u02c7\7d\2\2\u02c7\u02c8\7r\2\2\u02c8\u038d\7n\2\2\u02c9"+ "\u0388\7e\2\2\u02c7\u02c8\7l\2\2\u02c8\u02c9\7u\2\2\u02c9\u0388\7t\2\2"+
"\u02ca\7e\2\2\u02ca\u02cb\7n\2\2\u02cb\u038d\7e\2\2\u02cc\u02cd\7l\2\2"+ "\u02ca\u02cb\7c\2\2\u02cb\u02cc\7p\2\2\u02cc\u0388\7f\2\2\u02cd\u02ce"+
"\u02cd\u02ce\7u\2\2\u02ce\u038d\7t\2\2\u02cf\u02d0\7c\2\2\u02d0\u02d1"+ "\7t\2\2\u02ce\u02cf\7n\2\2\u02cf\u0388\7c\2\2\u02d0\u02d1\7d\2\2\u02d1"+
"\7p\2\2\u02d1\u038d\7f\2\2\u02d2\u02d3\7t\2\2\u02d3\u02d4\7n\2\2\u02d4"+ "\u02d2\7k\2\2\u02d2\u0388\7v\2\2\u02d3\u02d4\7t\2\2\u02d4\u02d5\7q\2\2"+
"\u038d\7c\2\2\u02d5\u02d6\7d\2\2\u02d6\u02d7\7k\2\2\u02d7\u038d\7v\2\2"+ "\u02d5\u0388\7n\2\2\u02d6\u02d7\7r\2\2\u02d7\u02d8\7n\2\2\u02d8\u0388"+
"\u02d8\u02d9\7t\2\2\u02d9\u02da\7q\2\2\u02da\u038d\7n\2\2\u02db\u02dc"+ "\7c\2\2\u02d9\u02da\7r\2\2\u02da\u02db\7n\2\2\u02db\u0388\7r\2\2\u02dc"+
"\7r\2\2\u02dc\u02dd\7n\2\2\u02dd\u038d\7c\2\2\u02de\u02df\7r\2\2\u02df"+ "\u02dd\7d\2\2\u02dd\u02de\7o\2\2\u02de\u0388\7k\2\2\u02df\u02e0\7u\2\2"+
"\u02e0\7n\2\2\u02e0\u038d\7r\2\2\u02e1\u02e2\7d\2\2\u02e2\u02e3\7o\2\2"+ "\u02e0\u02e1\7g\2\2\u02e1\u0388\7e\2\2\u02e2\u02e3\7t\2\2\u02e3\u02e4"+
"\u02e3\u038d\7k\2\2\u02e4\u02e5\7u\2\2\u02e5\u02e6\7g\2\2\u02e6\u038d"+ "\7v\2\2\u02e4\u0388\7k\2\2\u02e5\u02e6\7g\2\2\u02e6\u02e7\7q\2\2\u02e7"+
"\7e\2\2\u02e7\u02e8\7t\2\2\u02e8\u02e9\7v\2\2\u02e9\u038d\7k\2\2\u02ea"+ "\u0388\7t\2\2\u02e8\u02e9\7u\2\2\u02e9\u02ea\7t\2\2\u02ea\u0388\7g\2\2"+
"\u02eb\7g\2\2\u02eb\u02ec\7q\2\2\u02ec\u038d\7t\2\2\u02ed\u02ee\7u\2\2"+ "\u02eb\u02ec\7n\2\2\u02ec\u02ed\7u\2\2\u02ed\u0388\7t\2\2\u02ee\u02ef"+
"\u02ee\u02ef\7t\2\2\u02ef\u038d\7g\2\2\u02f0\u02f1\7n\2\2\u02f1\u02f2"+ "\7r\2\2\u02ef\u02f0\7j\2\2\u02f0\u0388\7c\2\2\u02f1\u02f2\7c\2\2\u02f2"+
"\7u\2\2\u02f2\u038d\7t\2\2\u02f3\u02f4\7r\2\2\u02f4\u02f5\7j\2\2\u02f5"+ "\u02f3\7n\2\2\u02f3\u0388\7t\2\2\u02f4\u02f5\7l\2\2\u02f5\u02f6\7o\2\2"+
"\u038d\7c\2\2\u02f6\u02f7\7c\2\2\u02f7\u02f8\7n\2\2\u02f8\u038d\7t\2\2"+ "\u02f6\u0388\7r\2\2\u02f7\u02f8\7d\2\2\u02f8\u02f9\7x\2\2\u02f9\u0388"+
"\u02f9\u02fa\7l\2\2\u02fa\u02fb\7o\2\2\u02fb\u038d\7r\2\2\u02fc\u02fd"+ "\7e\2\2\u02fa\u02fb\7e\2\2\u02fb\u02fc\7n\2\2\u02fc\u0388\7k\2\2\u02fd"+
"\7d\2\2\u02fd\u02fe\7x\2\2\u02fe\u038d\7e\2\2\u02ff\u0300\7e\2\2\u0300"+ "\u02fe\7t\2\2\u02fe\u02ff\7v\2\2\u02ff\u0388\7u\2\2\u0300\u0301\7c\2\2"+
"\u0301\7n\2\2\u0301\u038d\7k\2\2\u0302\u0303\7t\2\2\u0303\u0304\7v\2\2"+ "\u0301\u0302\7f\2\2\u0302\u0388\7e\2\2\u0303\u0304\7t\2\2\u0304\u0305"+
"\u0304\u038d\7u\2\2\u0305\u0306\7c\2\2\u0306\u0307\7f\2\2\u0307\u038d"+ "\7t\2\2\u0305\u0388\7c\2\2\u0306\u0307\7d\2\2\u0307\u0308\7x\2\2\u0308"+
"\7e\2\2\u0308\u0309\7t\2\2\u0309\u030a\7t\2\2\u030a\u038d\7c\2\2\u030b"+ "\u0388\7u\2\2\u0309\u030a\7u\2\2\u030a\u030b\7g\2\2\u030b\u0388\7k\2\2"+
"\u030c\7d\2\2\u030c\u030d\7x\2\2\u030d\u038d\7u\2\2\u030e\u030f\7u\2\2"+ "\u030c\u030d\7u\2\2\u030d\u030e\7c\2\2\u030e\u0388\7z\2\2\u030f\u0310"+
"\u030f\u0310\7g\2\2\u0310\u038d\7k\2\2\u0311\u0312\7u\2\2\u0312\u0313"+ "\7u\2\2\u0310\u0311\7v\2\2\u0311\u0388\7{\2\2\u0312\u0313\7u\2\2\u0313"+
"\7c\2\2\u0313\u038d\7z\2\2\u0314\u0315\7u\2\2\u0315\u0316\7v\2\2\u0316"+ "\u0314\7v\2\2\u0314\u0388\7c\2\2\u0315\u0316\7u\2\2\u0316\u0317\7v\2\2"+
"\u038d\7{\2\2\u0317\u0318\7u\2\2\u0318\u0319\7v\2\2\u0319\u038d\7c\2\2"+ "\u0317\u0388\7z\2\2\u0318\u0319\7f\2\2\u0319\u031a\7g\2\2\u031a\u0388"+
"\u031a\u031b\7u\2\2\u031b\u031c\7v\2\2\u031c\u038d\7z\2\2\u031d\u031e"+ "\7{\2\2\u031b\u031c\7v\2\2\u031c\u031d\7z\2\2\u031d\u0388\7c\2\2\u031e"+
"\7f\2\2\u031e\u031f\7g\2\2\u031f\u038d\7{\2\2\u0320\u0321\7v\2\2\u0321"+ "\u031f\7z\2\2\u031f\u0320\7c\2\2\u0320\u0388\7c\2\2\u0321\u0322\7d\2\2"+
"\u0322\7z\2\2\u0322\u038d\7c\2\2\u0323\u0324\7z\2\2\u0324\u0325\7c\2\2"+ "\u0322\u0323\7e\2\2\u0323\u0388\7e\2\2\u0324\u0325\7c\2\2\u0325\u0326"+
"\u0325\u038d\7c\2\2\u0326\u0327\7d\2\2\u0327\u0328\7e\2\2\u0328\u038d"+ "\7j\2\2\u0326\u0388\7z\2\2\u0327\u0328\7v\2\2\u0328\u0329\7{\2\2\u0329"+
"\7e\2\2\u0329\u032a\7c\2\2\u032a\u032b\7j\2\2\u032b\u038d\7z\2\2\u032c"+ "\u0388\7c\2\2\u032a\u032b\7v\2\2\u032b\u032c\7z\2\2\u032c\u0388\7u\2\2"+
"\u032d\7v\2\2\u032d\u032e\7{\2\2\u032e\u038d\7c\2\2\u032f\u0330\7v\2\2"+ "\u032d\u032e\7v\2\2\u032e\u032f\7c\2\2\u032f\u0388\7u\2\2\u0330\u0331"+
"\u0330\u0331\7z\2\2\u0331\u038d\7u\2\2\u0332\u0333\7v\2\2\u0333\u0334"+ "\7u\2\2\u0331\u0332\7j\2\2\u0332\u0388\7{\2\2\u0333\u0334\7u\2\2\u0334"+
"\7c\2\2\u0334\u038d\7u\2\2\u0335\u0336\7u\2\2\u0336\u0337\7j\2\2\u0337"+ "\u0335\7j\2\2\u0335\u0388\7z\2\2\u0336\u0337\7n\2\2\u0337\u0338\7f\2\2"+
"\u038d\7{\2\2\u0338\u0339\7u\2\2\u0339\u033a\7j\2\2\u033a\u038d\7z\2\2"+ "\u0338\u0388\7{\2\2\u0339\u033a\7n\2\2\u033a\u033b\7f\2\2\u033b\u0388"+
"\u033b\u033c\7n\2\2\u033c\u033d\7f\2\2\u033d\u038d\7{\2\2\u033e\u033f"+ "\7c\2\2\u033c\u033d\7n\2\2\u033d\u033e\7f\2\2\u033e\u0388\7z\2\2\u033f"+
"\7n\2\2\u033f\u0340\7f\2\2\u0340\u038d\7c\2\2\u0341\u0342\7n\2\2\u0342"+ "\u0340\7n\2\2\u0340\u0341\7c\2\2\u0341\u0388\7z\2\2\u0342\u0343\7v\2\2"+
"\u0343\7f\2\2\u0343\u038d\7z\2\2\u0344\u0345\7n\2\2\u0345\u0346\7c\2\2"+ "\u0343\u0344\7c\2\2\u0344\u0388\7{\2\2\u0345\u0346\7v\2\2\u0346\u0347"+
"\u0346\u038d\7z\2\2\u0347\u0348\7v\2\2\u0348\u0349\7c\2\2\u0349\u038d"+ "\7c\2\2\u0347\u0388\7z\2\2\u0348\u0349\7d\2\2\u0349\u034a\7e\2\2\u034a"+
"\7{\2\2\u034a\u034b\7v\2\2\u034b\u034c\7c\2\2\u034c\u038d\7z\2\2\u034d"+ "\u0388\7u\2\2\u034b\u034c\7e\2\2\u034c\u034d\7n\2\2\u034d\u0388\7x\2\2"+
"\u034e\7d\2\2\u034e\u034f\7e\2\2\u034f\u038d\7u\2\2\u0350\u0351\7e\2\2"+ "\u034e\u034f\7v\2\2\u034f\u0350\7u\2\2\u0350\u0388\7z\2\2\u0351\u0352"+
"\u0351\u0352\7n\2\2\u0352\u038d\7x\2\2\u0353\u0354\7v\2\2\u0354\u0355"+ "\7n\2\2\u0352\u0353\7c\2\2\u0353\u0388\7u\2\2\u0354\u0355\7e\2\2\u0355"+
"\7u\2\2\u0355\u038d\7z\2\2\u0356\u0357\7n\2\2\u0357\u0358\7c\2\2\u0358"+ "\u0356\7r\2\2\u0356\u0388\7{\2\2\u0357\u0358\7e\2\2\u0358\u0359\7o\2\2"+
"\u038d\7u\2\2\u0359\u035a\7e\2\2\u035a\u035b\7r\2\2\u035b\u038d\7{\2\2"+ "\u0359\u0388\7r\2\2\u035a\u035b\7e\2\2\u035b\u035c\7r\2\2\u035c\u0388"+
"\u035c\u035d\7e\2\2\u035d\u035e\7o\2\2\u035e\u038d\7r\2\2\u035f\u0360"+ "\7z\2\2\u035d\u035e\7f\2\2\u035e\u035f\7e\2\2\u035f\u0388\7r\2\2\u0360"+
"\7e\2\2\u0360\u0361\7r\2\2\u0361\u038d\7z\2\2\u0362\u0363\7f\2\2\u0363"+ "\u0361\7f\2\2\u0361\u0362\7g\2\2\u0362\u0388\7e\2\2\u0363\u0364\7k\2\2"+
"\u0364\7e\2\2\u0364\u038d\7r\2\2\u0365\u0366\7f\2\2\u0366\u0367\7g\2\2"+ "\u0364\u0365\7p\2\2\u0365\u0388\7e\2\2\u0366\u0367\7c\2\2\u0367\u0368"+
"\u0367\u038d\7e\2\2\u0368\u0369\7k\2\2\u0369\u036a\7p\2\2\u036a\u038d"+ "\7z\2\2\u0368\u0388\7u\2\2\u0369\u036a\7d\2\2\u036a\u036b\7p\2\2\u036b"+
"\7e\2\2\u036b\u036c\7c\2\2\u036c\u036d\7z\2\2\u036d\u038d\7u\2\2\u036e"+ "\u0388\7g\2\2\u036c\u036d\7e\2\2\u036d\u036e\7n\2\2\u036e\u0388\7f\2\2"+
"\u036f\7d\2\2\u036f\u0370\7p\2\2\u0370\u038d\7g\2\2\u0371\u0372\7e\2\2"+ "\u036f\u0370\7u\2\2\u0370\u0371\7d\2\2\u0371\u0388\7e\2\2\u0372\u0373"+
"\u0372\u0373\7n\2\2\u0373\u038d\7f\2\2\u0374\u0375\7u\2\2\u0375\u0376"+ "\7k\2\2\u0373\u0374\7u\2\2\u0374\u0388\7e\2\2\u0375\u0376\7k\2\2\u0376"+
"\7d\2\2\u0376\u038d\7e\2\2\u0377\u0378\7k\2\2\u0378\u0379\7u\2\2\u0379"+ "\u0377\7p\2\2\u0377\u0388\7z\2\2\u0378\u0379\7d\2\2\u0379\u037a\7g\2\2"+
"\u038d\7e\2\2\u037a\u037b\7k\2\2\u037b\u037c\7p\2\2\u037c\u038d\7z\2\2"+ "\u037a\u0388\7s\2\2\u037b\u037c\7u\2\2\u037c\u037d\7g\2\2\u037d\u0388"+
"\u037d\u037e\7d\2\2\u037e\u037f\7g\2\2\u037f\u038d\7s\2\2\u0380\u0381"+ "\7f\2\2\u037e\u037f\7f\2\2\u037f\u0380\7g\2\2\u0380\u0388\7z\2\2\u0381"+
"\7u\2\2\u0381\u0382\7g\2\2\u0382\u038d\7f\2\2\u0383\u0384\7f\2\2\u0384"+ "\u0382\7k\2\2\u0382\u0383\7p\2\2\u0383\u0388\7{\2\2\u0384\u0385\7t\2\2"+
"\u0385\7g\2\2\u0385\u038d\7z\2\2\u0386\u0387\7k\2\2\u0387\u0388\7p\2\2"+ "\u0385\u0386\7q\2\2\u0386\u0388\7t\2\2\u0387\u02a9\3\2\2\2\u0387\u02ac"+
"\u0388\u038d\7{\2\2\u0389\u038a\7t\2\2\u038a\u038b\7q\2\2\u038b\u038d"+ "\3\2\2\2\u0387\u02af\3\2\2\2\u0387\u02b2\3\2\2\2\u0387\u02b5\3\2\2\2\u0387"+
"\7t\2\2\u038c\u02ae\3\2\2\2\u038c\u02b1\3\2\2\2\u038c\u02b4\3\2\2\2\u038c"+ "\u02b8\3\2\2\2\u0387\u02bb\3\2\2\2\u0387\u02be\3\2\2\2\u0387\u02c1\3\2"+
"\u02b7\3\2\2\2\u038c\u02ba\3\2\2\2\u038c\u02bd\3\2\2\2\u038c\u02c0\3\2"+ "\2\2\u0387\u02c4\3\2\2\2\u0387\u02c7\3\2\2\2\u0387\u02ca\3\2\2\2\u0387"+
"\2\2\u038c\u02c3\3\2\2\2\u038c\u02c6\3\2\2\2\u038c\u02c9\3\2\2\2\u038c"+ "\u02cd\3\2\2\2\u0387\u02d0\3\2\2\2\u0387\u02d3\3\2\2\2\u0387\u02d6\3\2"+
"\u02cc\3\2\2\2\u038c\u02cf\3\2\2\2\u038c\u02d2\3\2\2\2\u038c\u02d5\3\2"+ "\2\2\u0387\u02d9\3\2\2\2\u0387\u02dc\3\2\2\2\u0387\u02df\3\2\2\2\u0387"+
"\2\2\u038c\u02d8\3\2\2\2\u038c\u02db\3\2\2\2\u038c\u02de\3\2\2\2\u038c"+ "\u02e2\3\2\2\2\u0387\u02e5\3\2\2\2\u0387\u02e8\3\2\2\2\u0387\u02eb\3\2"+
"\u02e1\3\2\2\2\u038c\u02e4\3\2\2\2\u038c\u02e7\3\2\2\2\u038c\u02ea\3\2"+ "\2\2\u0387\u02ee\3\2\2\2\u0387\u02f1\3\2\2\2\u0387\u02f4\3\2\2\2\u0387"+
"\2\2\u038c\u02ed\3\2\2\2\u038c\u02f0\3\2\2\2\u038c\u02f3\3\2\2\2\u038c"+ "\u02f7\3\2\2\2\u0387\u02fa\3\2\2\2\u0387\u02fd\3\2\2\2\u0387\u0300\3\2"+
"\u02f6\3\2\2\2\u038c\u02f9\3\2\2\2\u038c\u02fc\3\2\2\2\u038c\u02ff\3\2"+ "\2\2\u0387\u0303\3\2\2\2\u0387\u0306\3\2\2\2\u0387\u0309\3\2\2\2\u0387"+
"\2\2\u038c\u0302\3\2\2\2\u038c\u0305\3\2\2\2\u038c\u0308\3\2\2\2\u038c"+ "\u030c\3\2\2\2\u0387\u030f\3\2\2\2\u0387\u0312\3\2\2\2\u0387\u0315\3\2"+
"\u030b\3\2\2\2\u038c\u030e\3\2\2\2\u038c\u0311\3\2\2\2\u038c\u0314\3\2"+ "\2\2\u0387\u0318\3\2\2\2\u0387\u031b\3\2\2\2\u0387\u031e\3\2\2\2\u0387"+
"\2\2\u038c\u0317\3\2\2\2\u038c\u031a\3\2\2\2\u038c\u031d\3\2\2\2\u038c"+ "\u0321\3\2\2\2\u0387\u0324\3\2\2\2\u0387\u0327\3\2\2\2\u0387\u032a\3\2"+
"\u0320\3\2\2\2\u038c\u0323\3\2\2\2\u038c\u0326\3\2\2\2\u038c\u0329\3\2"+ "\2\2\u0387\u032d\3\2\2\2\u0387\u0330\3\2\2\2\u0387\u0333\3\2\2\2\u0387"+
"\2\2\u038c\u032c\3\2\2\2\u038c\u032f\3\2\2\2\u038c\u0332\3\2\2\2\u038c"+ "\u0336\3\2\2\2\u0387\u0339\3\2\2\2\u0387\u033c\3\2\2\2\u0387\u033f\3\2"+
"\u0335\3\2\2\2\u038c\u0338\3\2\2\2\u038c\u033b\3\2\2\2\u038c\u033e\3\2"+ "\2\2\u0387\u0342\3\2\2\2\u0387\u0345\3\2\2\2\u0387\u0348\3\2\2\2\u0387"+
"\2\2\u038c\u0341\3\2\2\2\u038c\u0344\3\2\2\2\u038c\u0347\3\2\2\2\u038c"+ "\u034b\3\2\2\2\u0387\u034e\3\2\2\2\u0387\u0351\3\2\2\2\u0387\u0354\3\2"+
"\u034a\3\2\2\2\u038c\u034d\3\2\2\2\u038c\u0350\3\2\2\2\u038c\u0353\3\2"+ "\2\2\u0387\u0357\3\2\2\2\u0387\u035a\3\2\2\2\u0387\u035d\3\2\2\2\u0387"+
"\2\2\u038c\u0356\3\2\2\2\u038c\u0359\3\2\2\2\u038c\u035c\3\2\2\2\u038c"+ "\u0360\3\2\2\2\u0387\u0363\3\2\2\2\u0387\u0366\3\2\2\2\u0387\u0369\3\2"+
"\u035f\3\2\2\2\u038c\u0362\3\2\2\2\u038c\u0365\3\2\2\2\u038c\u0368\3\2"+ "\2\2\u0387\u036c\3\2\2\2\u0387\u036f\3\2\2\2\u0387\u0372\3\2\2\2\u0387"+
"\2\2\u038c\u036b\3\2\2\2\u038c\u036e\3\2\2\2\u038c\u0371\3\2\2\2\u038c"+ "\u0375\3\2\2\2\u0387\u0378\3\2\2\2\u0387\u037b\3\2\2\2\u0387\u037e\3\2"+
"\u0374\3\2\2\2\u038c\u0377\3\2\2\2\u038c\u037a\3\2\2\2\u038c\u037d\3\2"+ "\2\2\u0387\u0381\3\2\2\2\u0387\u0384\3\2\2\2\u0388\u00be\3\2\2\2\u0389"+
"\2\2\u038c\u0380\3\2\2\2\u038c\u0383\3\2\2\2\u038c\u0386\3\2\2\2\u038c"+ "\u038a\7k\2\2\u038a\u038b\7o\2\2\u038b\u038c\7r\2\2\u038c\u038d\7q\2\2"+
"\u0389\3\2\2\2\u038d\u00c0\3\2\2\2\u038e\u038f\7}\2\2\u038f\u0390\7}\2"+ "\u038d\u038e\7t\2\2\u038e\u038f\7v\2\2\u038f\u0390\3\2\2\2\u0390\u0391"+
"\2\u0390\u0394\3\2\2\2\u0391\u0393\13\2\2\2\u0392\u0391\3\2\2\2\u0393"+ "\b`\2\2\u0391\u00c0\3\2\2\2\u0392\u0398\7$\2\2\u0393\u0394\7^\2\2\u0394"+
"\u0396\3\2\2\2\u0394\u0395\3\2\2\2\u0394\u0392\3\2\2\2\u0395\u0397\3\2"+ "\u0397\7$\2\2\u0395\u0397\n\2\2\2\u0396\u0393\3\2\2\2\u0396\u0395\3\2"+
"\2\2\u0396\u0394\3\2\2\2\u0397\u0398\7\177\2\2\u0398\u0399\7\177\2\2\u0399"+ "\2\2\u0397\u039a\3\2\2\2\u0398\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399"+
"\u00c2\3\2\2\2\u039a\u039b\7d\2\2\u039b\u039c\7{\2\2\u039c\u039d\7v\2"+ "\u039b\3\2\2\2\u039a\u0398\3\2\2\2\u039b\u039c\7$\2\2\u039c\u039d\6a\2"+
"\2\u039d\u03c0\7g\2\2\u039e\u039f\7y\2\2\u039f\u03a0\7q\2\2\u03a0\u03a1"+ "\2\u039d\u039e\ba\3\2\u039e\u00c2\3\2\2\2\u039f\u03a0\7d\2\2\u03a0\u03a1"+
"\7t\2\2\u03a1\u03c0\7f\2\2\u03a2\u03a3\7f\2\2\u03a3\u03a4\7y\2\2\u03a4"+ "\7{\2\2\u03a1\u03a2\7v\2\2\u03a2\u03c5\7g\2\2\u03a3\u03a4\7y\2\2\u03a4"+
"\u03a5\7q\2\2\u03a5\u03a6\7t\2\2\u03a6\u03c0\7f\2\2\u03a7\u03a8\7d\2\2"+ "\u03a5\7q\2\2\u03a5\u03a6\7t\2\2\u03a6\u03c5\7f\2\2\u03a7\u03a8\7f\2\2"+
"\u03a8\u03a9\7q\2\2\u03a9\u03aa\7q\2\2\u03aa\u03c0\7n\2\2\u03ab\u03ac"+ "\u03a8\u03a9\7y\2\2\u03a9\u03aa\7q\2\2\u03aa\u03ab\7t\2\2\u03ab\u03c5"+
"\7e\2\2\u03ac\u03ad\7j\2\2\u03ad\u03ae\7c\2\2\u03ae\u03c0\7t\2\2\u03af"+ "\7f\2\2\u03ac\u03ad\7d\2\2\u03ad\u03ae\7q\2\2\u03ae\u03af\7q\2\2\u03af"+
"\u03b0\7u\2\2\u03b0\u03b1\7j\2\2\u03b1\u03b2\7q\2\2\u03b2\u03b3\7t\2\2"+ "\u03c5\7n\2\2\u03b0\u03b1\7e\2\2\u03b1\u03b2\7j\2\2\u03b2\u03b3\7c\2\2"+
"\u03b3\u03c0\7v\2\2\u03b4\u03b5\7k\2\2\u03b5\u03b6\7p\2\2\u03b6\u03c0"+ "\u03b3\u03c5\7t\2\2\u03b4\u03b5\7u\2\2\u03b5\u03b6\7j\2\2\u03b6\u03b7"+
"\7v\2\2\u03b7\u03b8\7n\2\2\u03b8\u03b9\7q\2\2\u03b9\u03ba\7p\2\2\u03ba"+ "\7q\2\2\u03b7\u03b8\7t\2\2\u03b8\u03c5\7v\2\2\u03b9\u03ba\7k\2\2\u03ba"+
"\u03c0\7i\2\2\u03bb\u03bc\7x\2\2\u03bc\u03bd\7q\2\2\u03bd\u03be\7k\2\2"+ "\u03bb\7p\2\2\u03bb\u03c5\7v\2\2\u03bc\u03bd\7n\2\2\u03bd\u03be\7q\2\2"+
"\u03be\u03c0\7f\2\2\u03bf\u039a\3\2\2\2\u03bf\u039e\3\2\2\2\u03bf\u03a2"+ "\u03be\u03bf\7p\2\2\u03bf\u03c5\7i\2\2\u03c0\u03c1\7x\2\2\u03c1\u03c2"+
"\3\2\2\2\u03bf\u03a7\3\2\2\2\u03bf\u03ab\3\2\2\2\u03bf\u03af\3\2\2\2\u03bf"+ "\7q\2\2\u03c2\u03c3\7k\2\2\u03c3\u03c5\7f\2\2\u03c4\u039f\3\2\2\2\u03c4"+
"\u03b4\3\2\2\2\u03bf\u03b7\3\2\2\2\u03bf\u03bb\3\2\2\2\u03c0\u00c4\3\2"+ "\u03a3\3\2\2\2\u03c4\u03a7\3\2\2\2\u03c4\u03ac\3\2\2\2\u03c4\u03b0\3\2"+
"\2\2\u03c1\u03c7\7$\2\2\u03c2\u03c3\7^\2\2\u03c3\u03c6\7$\2\2\u03c4\u03c6"+ "\2\2\u03c4\u03b4\3\2\2\2\u03c4\u03b9\3\2\2\2\u03c4\u03bc\3\2\2\2\u03c4"+
"\n\2\2\2\u03c5\u03c2\3\2\2\2\u03c5\u03c4\3\2\2\2\u03c6\u03c9\3\2\2\2\u03c7"+ "\u03c0\3\2\2\2\u03c5\u00c4\3\2\2\2\u03c6\u03cc\7$\2\2\u03c7\u03c8\7^\2"+
"\u03c5\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8\u03ca\3\2\2\2\u03c9\u03c7\3\2"+ "\2\u03c8\u03cb\7$\2\2\u03c9\u03cb\n\2\2\2\u03ca\u03c7\3\2\2\2\u03ca\u03c9"+
"\2\2\u03ca\u03cc\7$\2\2\u03cb\u03cd\t\3\2\2\u03cc\u03cb\3\2\2\2\u03cc"+ "\3\2\2\2\u03cb\u03ce\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd"+
"\u03cd\3\2\2\2\u03cd\u03d2\3\2\2\2\u03ce\u03d0\t\4\2\2\u03cf\u03d1\t\5"+ "\u03cf\3\2\2\2\u03ce\u03cc\3\2\2\2\u03cf\u03d1\7$\2\2\u03d0\u03d2\t\3"+
"\2\2\u03d0\u03cf\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d3\3\2\2\2\u03d2"+ "\2\2\u03d1\u03d0\3\2\2\2\u03d1\u03d2\3\2\2\2\u03d2\u03d7\3\2\2\2\u03d3"+
"\u03ce\3\2\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\3\2\2\2\u03d4\u03d6\t\3"+ "\u03d5\t\4\2\2\u03d4\u03d6\t\5\2\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2"+
"\2\2\u03d5\u03d4\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u00c6\3\2\2\2\u03d7"+ "\2\2\u03d6\u03d8\3\2\2\2\u03d7\u03d3\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8"+
"\u03db\7)\2\2\u03d8\u03d9\7^\2\2\u03d9\u03dc\t\6\2\2\u03da\u03dc\n\7\2"+ "\u03da\3\2\2\2\u03d9\u03db\t\3\2\2\u03da\u03d9\3\2\2\2\u03da\u03db\3\2"+
"\2\u03db\u03d8\3\2\2\2\u03db\u03da\3\2\2\2\u03dc\u03dd\3\2\2\2\u03dd\u03de"+ "\2\2\u03db\u03dc\3\2\2\2\u03dc\u03dd\6c\3\2\u03dd\u00c6\3\2\2\2\u03de"+
"\7)\2\2\u03de\u00c8\3\2\2\2\u03df\u03e0\7v\2\2\u03e0\u03e1\7t\2\2\u03e1"+ "\u03e2\7)\2\2\u03df\u03e0\7^\2\2\u03e0\u03e3\t\6\2\2\u03e1\u03e3\n\7\2"+
"\u03e2\7w\2\2\u03e2\u03e9\7g\2\2\u03e3\u03e4\7h\2\2\u03e4\u03e5\7c\2\2"+ "\2\u03e2\u03df\3\2\2\2\u03e2\u03e1\3\2\2\2\u03e3\u03e4\3\2\2\2\u03e4\u03e5"+
"\u03e5\u03e6\7n\2\2\u03e6\u03e7\7u\2\2\u03e7\u03e9\7g\2\2\u03e8\u03df"+ "\7)\2\2\u03e5\u00c8\3\2\2\2\u03e6\u03e7\7v\2\2\u03e7\u03e8\7t\2\2\u03e8"+
"\3\2\2\2\u03e8\u03e3\3\2\2\2\u03e9\u00ca\3\2\2\2\u03ea\u03ed\5\u00cdg"+ "\u03e9\7w\2\2\u03e9\u03f0\7g\2\2\u03ea\u03eb\7h\2\2\u03eb\u03ec\7c\2\2"+
"\2\u03eb\u03ed\5\u00d5k\2\u03ec\u03ea\3\2\2\2\u03ec\u03eb\3\2\2\2\u03ed"+ "\u03ec\u03ed\7n\2\2\u03ed\u03ee\7u\2\2\u03ee\u03f0\7g\2\2\u03ef\u03e6"+
"\u00cc\3\2\2\2\u03ee\u03f2\5\u00cfh\2\u03ef\u03f2\5\u00d1i\2\u03f0\u03f2"+ "\3\2\2\2\u03ef\u03ea\3\2\2\2\u03f0\u00ca\3\2\2\2\u03f1\u03f4\5\u00cdg"+
"\5\u00d3j\2\u03f1\u03ee\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f1\u03f0\3\2\2"+ "\2\u03f2\u03f4\5\u00d5k\2\u03f3\u03f1\3\2\2\2\u03f3\u03f2\3\2\2\2\u03f4"+
"\2\u03f2\u00ce\3\2\2\2\u03f3\u03f9\7\'\2\2\u03f4\u03f5\7\62\2\2\u03f5"+ "\u00cc\3\2\2\2\u03f5\u03f9\5\u00cfh\2\u03f6\u03f9\5\u00d1i\2\u03f7\u03f9"+
"\u03f9\7d\2\2\u03f6\u03f7\7\62\2\2\u03f7\u03f9\7D\2\2\u03f8\u03f3\3\2"+ "\5\u00d3j\2\u03f8\u03f5\3\2\2\2\u03f8\u03f6\3\2\2\2\u03f8\u03f7\3\2\2"+
"\2\2\u03f8\u03f4\3\2\2\2\u03f8\u03f6\3\2\2\2\u03f9\u03fd\3\2\2\2\u03fa"+ "\2\u03f9\u00ce\3\2\2\2\u03fa\u0400\7\'\2\2\u03fb\u03fc\7\62\2\2\u03fc"+
"\u03fc\5\u00ddo\2\u03fb\u03fa\3\2\2\2\u03fc\u03ff\3\2\2\2\u03fd\u03fb"+ "\u0400\7d\2\2\u03fd\u03fe\7\62\2\2\u03fe\u0400\7D\2\2\u03ff\u03fa\3\2"+
"\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u0400\3\2\2\2\u03ff\u03fd\3\2\2\2\u0400"+ "\2\2\u03ff\u03fb\3\2\2\2\u03ff\u03fd\3\2\2\2\u0400\u0404\3\2\2\2\u0401"+
"\u0402\7\60\2\2\u0401\u0403\5\u00ddo\2\u0402\u0401\3\2\2\2\u0403\u0404"+ "\u0403\5\u00ddo\2\u0402\u0401\3\2\2\2\u0403\u0406\3\2\2\2\u0404\u0402"+
"\3\2\2\2\u0404\u0402\3\2\2\2\u0404\u0405\3\2\2\2\u0405\u00d0\3\2\2\2\u0406"+ "\3\2\2\2\u0404\u0405\3\2\2\2\u0405\u0407\3\2\2\2\u0406\u0404\3\2\2\2\u0407"+
"\u0408\5\u00dfp\2\u0407\u0406\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407"+ "\u0409\7\60\2\2\u0408\u040a\5\u00ddo\2\u0409\u0408\3\2\2\2\u040a\u040b"+
"\3\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ "\3\2\2\2\u040b\u0409\3\2\2\2\u040b\u040c\3\2\2\2\u040c\u00d0\3\2\2\2\u040d"+
"\u040e\7\60\2\2\u040d\u040f\5\u00dfp\2\u040e\u040d\3\2\2\2\u040f\u0410"+ "\u040f\5\u00dfp\2\u040e\u040d\3\2\2\2\u040f\u0412\3\2\2\2\u0410\u040e"+
"\3\2\2\2\u0410\u040e\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u00d2\3\2\2\2\u0412"+ "\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0413\3\2\2\2\u0412\u0410\3\2\2\2\u0413"+
"\u0418\7&\2\2\u0413\u0414\7\62\2\2\u0414\u0418\7z\2\2\u0415\u0416\7\62"+ "\u0415\7\60\2\2\u0414\u0416\5\u00dfp\2\u0415\u0414\3\2\2\2\u0416\u0417"+
"\2\2\u0416\u0418\7Z\2\2\u0417\u0412\3\2\2\2\u0417\u0413\3\2\2\2\u0417"+ "\3\2\2\2\u0417\u0415\3\2\2\2\u0417\u0418\3\2\2\2\u0418\u00d2\3\2\2\2\u0419"+
"\u0415\3\2\2\2\u0418\u041c\3\2\2\2\u0419\u041b\5\u00e1q\2\u041a\u0419"+ "\u041f\7&\2\2\u041a\u041b\7\62\2\2\u041b\u041f\7z\2\2\u041c\u041d\7\62"+
"\3\2\2\2\u041b\u041e\3\2\2\2\u041c\u041a\3\2\2\2\u041c\u041d\3\2\2\2\u041d"+ "\2\2\u041d\u041f\7Z\2\2\u041e\u0419\3\2\2\2\u041e\u041a\3\2\2\2\u041e"+
"\u041f\3\2\2\2\u041e\u041c\3\2\2\2\u041f\u0421\7\60\2\2\u0420\u0422\5"+ "\u041c\3\2\2\2\u041f\u0423\3\2\2\2\u0420\u0422\5\u00e1q\2\u0421\u0420"+
"\u00e1q\2\u0421\u0420\3\2\2\2\u0422\u0423\3\2\2\2\u0423\u0421\3\2\2\2"+ "\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424"+
"\u0423\u0424\3\2\2\2\u0424\u00d4\3\2\2\2\u0425\u0429\5\u00d9m\2\u0426"+ "\u0426\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0428\7\60\2\2\u0427\u0429\5"+
"\u0429\5\u00dbn\2\u0427\u0429\5\u00d7l\2\u0428\u0425\3\2\2\2\u0428\u0426"+ "\u00e1q\2\u0428\u0427\3\2\2\2\u0429\u042a\3\2\2\2\u042a\u0428\3\2\2\2"+
"\3\2\2\2\u0428\u0427\3\2\2\2\u0429\u042d\3\2\2\2\u042a\u042b\t\b\2\2\u042b"+ "\u042a\u042b\3\2\2\2\u042b\u00d4\3\2\2\2\u042c\u0430\5\u00d9m\2\u042d"+
"\u042e\t\t\2\2\u042c\u042e\7n\2\2\u042d\u042a\3\2\2\2\u042d\u042c\3\2"+ "\u0430\5\u00dbn\2\u042e\u0430\5\u00d7l\2\u042f\u042c\3\2\2\2\u042f\u042d"+
"\2\2\u042d\u042e\3\2\2\2\u042e\u00d6\3\2\2\2\u042f\u0430\7\62\2\2\u0430"+ "\3\2\2\2\u042f\u042e\3\2\2\2\u0430\u0434\3\2\2\2\u0431\u0432\t\b\2\2\u0432"+
"\u0432\t\n\2\2\u0431\u0433\5\u00ddo\2\u0432\u0431\3\2\2\2\u0433\u0434"+ "\u0435\t\t\2\2\u0433\u0435\7n\2\2\u0434\u0431\3\2\2\2\u0434\u0433\3\2"+
"\3\2\2\2\u0434\u0432\3\2\2\2\u0434\u0435\3\2\2\2\u0435\u043d\3\2\2\2\u0436"+ "\2\2\u0434\u0435\3\2\2\2\u0435\u00d6\3\2\2\2\u0436\u0437\7\62\2\2\u0437"+
"\u0438\7\'\2\2\u0437\u0439\5\u00ddo\2\u0438\u0437\3\2\2\2\u0439\u043a"+ "\u0439\t\n\2\2\u0438\u043a\5\u00ddo\2\u0439\u0438\3\2\2\2\u043a\u043b"+
"\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b\u043d\3\2\2\2\u043c"+ "\3\2\2\2\u043b\u0439\3\2\2\2\u043b\u043c\3\2\2\2\u043c\u0444\3\2\2\2\u043d"+
"\u042f\3\2\2\2\u043c\u0436\3\2\2\2\u043d\u00d8\3\2\2\2\u043e\u0440\5\u00df"+ "\u043f\7\'\2\2\u043e\u0440\5\u00ddo\2\u043f\u043e\3\2\2\2\u0440\u0441"+
"p\2\u043f\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u043f\3\2\2\2\u0441"+ "\3\2\2\2\u0441\u043f\3\2\2\2\u0441\u0442\3\2\2\2\u0442\u0444\3\2\2\2\u0443"+
"\u0442\3\2\2\2\u0442\u00da\3\2\2\2\u0443\u0449\7&\2\2\u0444\u0445\7\62"+ "\u0436\3\2\2\2\u0443\u043d\3\2\2\2\u0444\u00d8\3\2\2\2\u0445\u0447\5\u00df"+
"\2\2\u0445\u0449\7z\2\2\u0446\u0447\7\62\2\2\u0447\u0449\7Z\2\2\u0448"+ "p\2\u0446\u0445\3\2\2\2\u0447\u0448\3\2\2\2\u0448\u0446\3\2\2\2\u0448"+
"\u0443\3\2\2\2\u0448\u0444\3\2\2\2\u0448\u0446\3\2\2\2\u0449\u044b\3\2"+ "\u0449\3\2\2\2\u0449\u00da\3\2\2\2\u044a\u0450\7&\2\2\u044b\u044c\7\62"+
"\2\2\u044a\u044c\5\u00e1q\2\u044b\u044a\3\2\2\2\u044c\u044d\3\2\2\2\u044d"+ "\2\2\u044c\u0450\7z\2\2\u044d\u044e\7\62\2\2\u044e\u0450\7Z\2\2\u044f"+
"\u044b\3\2\2\2\u044d\u044e\3\2\2\2\u044e\u00dc\3\2\2\2\u044f\u0450\t\13"+ "\u044a\3\2\2\2\u044f\u044b\3\2\2\2\u044f\u044d\3\2\2\2\u0450\u0452\3\2"+
"\2\2\u0450\u00de\3\2\2\2\u0451\u0452\t\f\2\2\u0452\u00e0\3\2\2\2\u0453"+ "\2\2\u0451\u0453\5\u00e1q\2\u0452\u0451\3\2\2\2\u0453\u0454\3\2\2\2\u0454"+
"\u0454\t\r\2\2\u0454\u00e2\3\2\2\2\u0455\u0459\5\u00e7t\2\u0456\u0458"+ "\u0452\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u00dc\3\2\2\2\u0456\u0457\t\13"+
"\5\u00e9u\2\u0457\u0456\3\2\2\2\u0458\u045b\3\2\2\2\u0459\u0457\3\2\2"+ "\2\2\u0457\u00de\3\2\2\2\u0458\u0459\t\f\2\2\u0459\u00e0\3\2\2\2\u045a"+
"\2\u0459\u045a\3\2\2\2\u045a\u045c\3\2\2\2\u045b\u0459\3\2\2\2\u045c\u045d"+ "\u045b\t\r\2\2\u045b\u00e2\3\2\2\2\u045c\u0460\5\u00e7t\2\u045d\u045f"+
"\6r\2\2\u045d\u00e4\3\2\2\2\u045e\u0462\5\u00e7t\2\u045f\u0461\5\u00e9"+ "\5\u00e9u\2\u045e\u045d\3\2\2\2\u045f\u0462\3\2\2\2\u0460\u045e\3\2\2"+
"u\2\u0460\u045f\3\2\2\2\u0461\u0464\3\2\2\2\u0462\u0460\3\2\2\2\u0462"+ "\2\u0460\u0461\3\2\2\2\u0461\u0463\3\2\2\2\u0462\u0460\3\2\2\2\u0463\u0464"+
"\u0463\3\2\2\2\u0463\u0465\3\2\2\2\u0464\u0462\3\2\2\2\u0465\u0466\6s"+ "\6r\4\2\u0464\u00e4\3\2\2\2\u0465\u0469\5\u00e7t\2\u0466\u0468\5\u00e9"+
"\3\2\u0466\u00e6\3\2\2\2\u0467\u0468\t\16\2\2\u0468\u00e8\3\2\2\2\u0469"+ "u\2\u0467\u0466\3\2\2\2\u0468\u046b\3\2\2\2\u0469\u0467\3\2\2\2\u0469"+
"\u046a\t\17\2\2\u046a\u00ea\3\2\2\2\u046b\u046f\7#\2\2\u046c\u046e\5\u00e9"+ "\u046a\3\2\2\2\u046a\u046c\3\2\2\2\u046b\u0469\3\2\2\2\u046c\u046d\6s"+
"u\2\u046d\u046c\3\2\2\2\u046e\u0471\3\2\2\2\u046f\u046d\3\2\2\2\u046f"+ "\5\2\u046d\u00e6\3\2\2\2\u046e\u046f\t\16\2\2\u046f\u00e8\3\2\2\2\u0470"+
"\u0470\3\2\2\2\u0470\u0473\3\2\2\2\u0471\u046f\3\2\2\2\u0472\u0474\t\20"+ "\u0471\t\17\2\2\u0471\u00ea\3\2\2\2\u0472\u0476\7#\2\2\u0473\u0475\5\u00e9"+
"\2\2\u0473\u0472\3\2\2\2\u0474\u0475\3\2\2\2\u0475\u0473\3\2\2\2\u0475"+ "u\2\u0474\u0473\3\2\2\2\u0475\u0478\3\2\2\2\u0476\u0474\3\2\2\2\u0476"+
"\u0476\3\2\2\2\u0476\u0477\3\2\2\2\u0477\u0478\6v\4\2\u0478\u00ec\3\2"+ "\u0477\3\2\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2\2\2\u0479\u047b\t\20"+
"\2\2\u0479\u047b\t\21\2\2\u047a\u0479\3\2\2\2\u047b\u047c\3\2\2\2\u047c"+ "\2\2\u047a\u0479\3\2\2\2\u047b\u047c\3\2\2\2\u047c\u047a\3\2\2\2\u047c"+
"\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u047f\bw"+ "\u047d\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u047f\6v\6\2\u047f\u00ec\3\2"+
"\2\2\u047f\u00ee\3\2\2\2\u0480\u0481\7\61\2\2\u0481\u0482\7\61\2\2\u0482"+ "\2\2\u0480\u0481\7}\2\2\u0481\u0482\7}\2\2\u0482\u0486\3\2\2\2\u0483\u0485"+
"\u0486\3\2\2\2\u0483\u0485\n\22\2\2\u0484\u0483\3\2\2\2\u0485\u0488\3"+ "\13\2\2\2\u0484\u0483\3\2\2\2\u0485\u0488\3\2\2\2\u0486\u0487\3\2\2\2"+
"\2\2\2\u0486\u0484\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0489\3\2\2\2\u0488"+ "\u0486\u0484\3\2\2\2\u0487\u0489\3\2\2\2\u0488\u0486\3\2\2\2\u0489\u048a"+
"\u0486\3\2\2\2\u0489\u048a\bx\3\2\u048a\u00f0\3\2\2\2\u048b\u048c\7\61"+ "\7\177\2\2\u048a\u048b\7\177\2\2\u048b\u00ee\3\2\2\2\u048c\u048e\t\21"+
"\2\2\u048c\u048d\7,\2\2\u048d\u0491\3\2\2\2\u048e\u0490\13\2\2\2\u048f"+ "\2\2\u048d\u048c\3\2\2\2\u048e\u048f\3\2\2\2\u048f\u048d\3\2\2\2\u048f"+
"\u048e\3\2\2\2\u0490\u0493\3\2\2\2\u0491\u0492\3\2\2\2\u0491\u048f\3\2"+ "\u0490\3\2\2\2\u0490\u0491\3\2\2\2\u0491\u0492\bx\4\2\u0492\u00f0\3\2"+
"\2\2\u0492\u0494\3\2\2\2\u0493\u0491\3\2\2\2\u0494\u0495\7,\2\2\u0495"+ "\2\2\u0493\u0494\7\61\2\2\u0494\u0495\7\61\2\2\u0495\u0499\3\2\2\2\u0496"+
"\u0496\7\61\2\2\u0496\u0497\3\2\2\2\u0497\u0498\by\3\2\u0498\u00f2\3\2"+ "\u0498\n\22\2\2\u0497\u0496\3\2\2\2\u0498\u049b\3\2\2\2\u0499\u0497\3"+
"\2\2\'\2\u038c\u0394\u03bf\u03c5\u03c7\u03cc\u03d0\u03d2\u03d5\u03db\u03e8"+ "\2\2\2\u0499\u049a\3\2\2\2\u049a\u049c\3\2\2\2\u049b\u0499\3\2\2\2\u049c"+
"\u03ec\u03f1\u03f8\u03fd\u0404\u0409\u0410\u0417\u041c\u0423\u0428\u042d"+ "\u049d\by\5\2\u049d\u00f2\3\2\2\2\u049e\u049f\7\61\2\2\u049f\u04a0\7,"+
"\u0434\u043a\u043c\u0441\u0448\u044d\u0459\u0462\u046f\u0475\u047c\u0486"+ "\2\2\u04a0\u04a4\3\2\2\2\u04a1\u04a3\13\2\2\2\u04a2\u04a1\3\2\2\2\u04a3"+
"\u0491\4\2\3\2\2\4\2"; "\u04a6\3\2\2\2\u04a4\u04a5\3\2\2\2\u04a4\u04a2\3\2\2\2\u04a5\u04a7\3\2"+
"\2\2\u04a6\u04a4\3\2\2\2\u04a7\u04a8\7,\2\2\u04a8\u04a9\7\61\2\2\u04a9"+
"\u04aa\3\2\2\2\u04aa\u04ab\bz\5\2\u04ab\u00f4\3\2\2\2)\2\u0387\u0396\u0398"+
"\u03c4\u03ca\u03cc\u03d1\u03d5\u03d7\u03da\u03e2\u03ef\u03f3\u03f8\u03ff"+
"\u0404\u040b\u0410\u0417\u041e\u0423\u042a\u042f\u0434\u043b\u0441\u0443"+
"\u0448\u044f\u0454\u0460\u0469\u0476\u047c\u0486\u048f\u0499\u04a4\6\3"+
"`\2\3a\3\2\3\2\2\4\2";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -91,9 +91,9 @@ T__89=90
T__90=91 T__90=91
T__91=92 T__91=92
T__92=93 T__92=93
T__93=94 MNEMONIC=94
MNEMONIC=95 IMPORT=95
KICKASM=96 IMPORTFILE=96
SIMPLETYPE=97 SIMPLETYPE=97
STRING=98 STRING=98
CHAR=99 CHAR=99
@ -110,100 +110,101 @@ HEXINTEGER=109
NAME=110 NAME=110
TYPEDEFNAME=111 TYPEDEFNAME=111
ASMREL=112 ASMREL=112
WS=113 KICKASM=113
COMMENT_LINE=114 WS=114
COMMENT_BLOCK=115 COMMENT_LINE=115
'import'=1 COMMENT_BLOCK=116
';'=2 ';'=1
'typedef'=3 'typedef'=2
','=4 ','=3
'='=5 '='=4
'('=6 '('=5
')'=7 ')'=6
'{'=8 '{'=7
'}'=9 '}'=8
'#pragma'=10 '#pragma'=9
'reserve'=11 'reserve'=10
'#reserve'=12 '#reserve'=11
'pc'=13 'pc'=12
'#pc'=14 '#pc'=13
'target'=15 'target'=14
'#target'=16 '#target'=15
'link'=17 'link'=16
'code_seg'=18 'code_seg'=17
'data_seg'=19 'data_seg'=18
'encoding'=20 'encoding'=19
'#encoding'=21 '#encoding'=20
'const'=22 'const'=21
'extern'=23 'extern'=22
'export'=24 'export'=23
'align'=25 'align'=24
'register'=26 'register'=25
'inline'=27 'inline'=26
'volatile'=28 'volatile'=27
'interrupt'=29 'interrupt'=28
'if'=30 'if'=29
'else'=31 'else'=30
'while'=32 'while'=31
'do'=33 'do'=32
'for'=34 'for'=33
'switch'=35 'switch'=34
'return'=36 'return'=35
'break'=37 'break'=36
'continue'=38 'continue'=37
'asm'=39 'asm'=38
'default:'=40 'default:'=39
'case'=41 'case'=40
':'=42 ':'=41
'..'=43 '..'=42
'signed'=44 'signed'=43
'unsigned'=45 'unsigned'=44
'*'=46 '*'=45
'['=47 '['=46
']'=48 ']'=47
'struct'=49 'struct'=48
'enum'=50 'enum'=49
'.'=51 '.'=50
'->'=52 '->'=51
'sizeof'=53 'sizeof'=52
'typeid'=54 'typeid'=53
'--'=55 '--'=54
'++'=56 '++'=55
'+'=57 '+'=56
'-'=58 '-'=57
'!'=59 '!'=58
'&'=60 '&'=59
'~'=61 '~'=60
'>>'=62 '>>'=61
'<<'=63 '<<'=62
'/'=64 '/'=63
'%'=65 '%'=64
'<'=66 '<'=65
'>'=67 '>'=66
'=='=68 '=='=67
'!='=69 '!='=68
'<='=70 '<='=69
'>='=71 '>='=70
'^'=72 '^'=71
'|'=73 '|'=72
'&&'=74 '&&'=73
'||'=75 '||'=74
'?'=76 '?'=75
'+='=77 '+='=76
'-='=78 '-='=77
'*='=79 '*='=78
'/='=80 '/='=79
'%='=81 '%='=80
'<<='=82 '<<='=81
'>>='=83 '>>='=82
'&='=84 '&='=83
'|='=85 '|='=84
'^='=86 '^='=85
'kickasm'=87 'kickasm'=86
'resource'=88 'resource'=87
'uses'=89 'uses'=88
'clobbers'=90 'clobbers'=89
'bytes'=91 'bytes'=90
'cycles'=92 'cycles'=91
'.byte'=93 '.byte'=92
'#'=94 '#'=93
'import'=95

View File

@ -30,15 +30,25 @@ public interface KickCListener extends ParseTreeListener {
*/ */
void exitAsmFile(KickCParser.AsmFileContext ctx); void exitAsmFile(KickCParser.AsmFileContext ctx);
/** /**
* Enter a parse tree produced by {@link KickCParser#importSeq}. * Enter a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree * @param ctx the parse tree
*/ */
void enterImportSeq(KickCParser.ImportSeqContext ctx); void enterDeclSeq(KickCParser.DeclSeqContext ctx);
/** /**
* Exit a parse tree produced by {@link KickCParser#importSeq}. * Exit a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree * @param ctx the parse tree
*/ */
void exitImportSeq(KickCParser.ImportSeqContext ctx); void exitDeclSeq(KickCParser.DeclSeqContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#declOrImport}.
* @param ctx the parse tree
*/
void enterDeclOrImport(KickCParser.DeclOrImportContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#declOrImport}.
* @param ctx the parse tree
*/
void exitDeclOrImport(KickCParser.DeclOrImportContext ctx);
/** /**
* Enter a parse tree produced by {@link KickCParser#importDecl}. * Enter a parse tree produced by {@link KickCParser#importDecl}.
* @param ctx the parse tree * @param ctx the parse tree
@ -49,16 +59,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree * @param ctx the parse tree
*/ */
void exitImportDecl(KickCParser.ImportDeclContext ctx); void exitImportDecl(KickCParser.ImportDeclContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree
*/
void enterDeclSeq(KickCParser.DeclSeqContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree
*/
void exitDeclSeq(KickCParser.DeclSeqContext ctx);
/** /**
* Enter a parse tree produced by {@link KickCParser#decl}. * Enter a parse tree produced by {@link KickCParser#decl}.
* @param ctx the parse tree * @param ctx the parse tree

File diff suppressed because it is too large Load Diff

View File

@ -25,23 +25,23 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
*/ */
T visitAsmFile(KickCParser.AsmFileContext ctx); T visitAsmFile(KickCParser.AsmFileContext ctx);
/** /**
* Visit a parse tree produced by {@link KickCParser#importSeq}. * Visit a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree * @param ctx the parse tree
* @return the visitor result * @return the visitor result
*/ */
T visitImportSeq(KickCParser.ImportSeqContext ctx); T visitDeclSeq(KickCParser.DeclSeqContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#declOrImport}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclOrImport(KickCParser.DeclOrImportContext ctx);
/** /**
* Visit a parse tree produced by {@link KickCParser#importDecl}. * Visit a parse tree produced by {@link KickCParser#importDecl}.
* @param ctx the parse tree * @param ctx the parse tree
* @return the visitor result * @return the visitor result
*/ */
T visitImportDecl(KickCParser.ImportDeclContext ctx); T visitImportDecl(KickCParser.ImportDeclContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#declSeq}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclSeq(KickCParser.DeclSeqContext ctx);
/** /**
* Visit a parse tree produced by {@link KickCParser#decl}. * Visit a parse tree produced by {@link KickCParser#decl}.
* @param ctx the parse tree * @param ctx the parse tree

View File

@ -1,36 +0,0 @@
package dk.camelot64.kickc.parser;
import java.util.ArrayList;
import java.util.List;
/**
* State used to control lexing/parsing
*/
public class ParserState {
/** Names of typedefs. Used by lexer to know the difference between normal value IDENTIFIERS and TYPEIDENTIFIERS */
List<String> typedefs;
/** True whenever the lexer/parser is parsing ASM. Enables/disables a lexer rules that might interfere.*/
boolean isAsm;
public ParserState() {
typedefs = new ArrayList<>();
}
public void addTypedef(String identifier) {
typedefs.add(identifier);
}
public boolean isTypedef(String identifier) {
return typedefs.contains(identifier);
}
public boolean isAsm() {
return isAsm;
}
public void setAsm(boolean asm) {
isAsm = asm;
}
}

View File

@ -1,7 +1,8 @@
package dk.camelot64.kickc.passes; package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.Compiler; import dk.camelot64.kickc.parser.CParser;
import dk.camelot64.kickc.NumberParser; import dk.camelot64.kickc.NumberParser;
import dk.camelot64.kickc.SourceLoader;
import dk.camelot64.kickc.asm.AsmClobber; import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.model.*; import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.operators.*; import dk.camelot64.kickc.model.operators.*;
@ -11,10 +12,7 @@ import dk.camelot64.kickc.model.types.*;
import dk.camelot64.kickc.model.values.*; import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.parser.KickCBaseVisitor; import dk.camelot64.kickc.parser.KickCBaseVisitor;
import dk.camelot64.kickc.parser.KickCParser; import dk.camelot64.kickc.parser.KickCParser;
import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode; import org.antlr.v4.runtime.tree.TerminalNode;
@ -30,12 +28,11 @@ import java.util.regex.Pattern;
*/ */
public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> { public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
/** The source file currently being parsed. */ /** The C parser keeping track of C-files and lexers */
private File file; private CParser cParser;
/** The source ANTLR parse tree of the source file. */ /** The source ANTLR parse tree of the source file. */
private KickCParser.FileContext fileCtx; private KickCParser.FileContext fileCtx;
/** The source ANTLR Token Stream (used for finding comments in the lexer input.) */
private CommonTokenStream tokenStream;
/** The program containing all compile structures. */ /** The program containing all compile structures. */
private Program program; private Program program;
@ -44,9 +41,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
/** Used to build the scopes of the source file. */ /** Used to build the scopes of the source file. */
private Stack<Scope> scopeStack; private Stack<Scope> scopeStack;
public Pass0GenerateStatementSequence(File file, CommonTokenStream tokenStream, KickCParser.FileContext fileCtx, Program program) { public Pass0GenerateStatementSequence(CParser cParser, KickCParser.FileContext fileCtx, Program program) {
this.file = file; this.cParser = cParser;
this.tokenStream = tokenStream;
this.fileCtx = fileCtx; this.fileCtx = fileCtx;
this.program = program; this.program = program;
this.sequence = program.getStatementSequence(); this.sequence = program.getStatementSequence();
@ -77,36 +73,20 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
// Only set program file level comments for the first file. // Only set program file level comments for the first file.
program.setFileComments(ensureUnusedComments(getCommentsFile(ctx))); program.setFileComments(ensureUnusedComments(getCommentsFile(ctx)));
} }
this.visit(ctx.importSeq());
this.visit(ctx.declSeq()); this.visit(ctx.declSeq());
return null; return null;
} }
@Override
public Object visitImportSeq(KickCParser.ImportSeqContext ctx) {
for(KickCParser.ImportDeclContext importDeclContext : ctx.importDecl()) {
this.visit(importDeclContext);
}
return null;
}
@Override @Override
public Object visitImportDecl(KickCParser.ImportDeclContext ctx) { public Object visitImportDecl(KickCParser.ImportDeclContext ctx) {
String importName = ctx.STRING().getText(); String importName = ctx.IMPORTFILE().getText();
String importFileName = importName.substring(1, importName.length() - 1); String importFileName = importName.substring(1, importName.length() - 1);
if(program.getLog().isVerboseParse()) { if(program.getLog().isVerboseParse()) {
program.getLog().append("Importing " + importFileName); program.getLog().append("Importing " + importFileName);
} }
Path currentPath = file.toPath().getParent(); // The Parser / Lexer will automatically add the import file content here in the token stream
Compiler.loadAndParseFile(importFileName, program, currentPath); //Path currentPath = file.toPath().getParent();
return null; //SourceLoader.loadAndParseFile(importFileName, currentPath, program);
}
@Override
public Object visitDeclSeq(KickCParser.DeclSeqContext ctx) {
for(KickCParser.DeclContext declContext : ctx.decl()) {
this.visit(declContext);
}
return null; return null;
} }
@ -115,8 +95,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
String linkName = ctx.STRING().getText(); String linkName = ctx.STRING().getText();
String linkFileName = linkName.substring(1, linkName.length() - 1); String linkFileName = linkName.substring(1, linkName.length() - 1);
program.getLog().append("Loading link script " + linkName); program.getLog().append("Loading link script " + linkName);
Path currentPath = file.toPath().getParent(); Path currentPath = cParser.getSourceFolderPath(ctx);
Compiler.loadLinkScriptFile(linkFileName, program, currentPath); SourceLoader.loadLinkScriptFile(linkFileName, currentPath, program);
return null; return null;
} }
@ -443,8 +423,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
TerminalNode resource = ctx.STRING(); TerminalNode resource = ctx.STRING();
String resourceName = resource.getText(); String resourceName = resource.getText();
resourceName = resourceName.substring(1, resourceName.length() - 1); resourceName = resourceName.substring(1, resourceName.length() - 1);
Path currentPath = file.toPath().getParent(); Path currentPath = cParser.getSourceFolderPath(ctx);
File resourceFile = Compiler.loadFile(resourceName, currentPath, program); File resourceFile = SourceLoader.loadFile(resourceName, currentPath, program);
program.addAsmResourceFile(resourceFile.toPath()); program.addAsmResourceFile(resourceFile.toPath());
if(program.getLog().isVerboseParse()) { if(program.getLog().isVerboseParse()) {
program.getLog().append("Added resource " + resourceFile.getPath().replace('\\', '/')); program.getLog().append("Added resource " + resourceFile.getPath().replace('\\', '/'));
@ -1907,6 +1887,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
private List<List<Comment>> getCommentBlocks(ParserRuleContext ctx) { private List<List<Comment>> getCommentBlocks(ParserRuleContext ctx) {
List<List<Comment>> commentBlocks = new ArrayList<>(); List<List<Comment>> commentBlocks = new ArrayList<>();
List<Comment> comments = new ArrayList<>(); List<Comment> comments = new ArrayList<>();
BufferedTokenStream tokenStream = cParser.getTokenStream();
List<Token> hiddenTokens = tokenStream.getHiddenTokensToLeft(ctx.start.getTokenIndex()); List<Token> hiddenTokens = tokenStream.getHiddenTokensToLeft(ctx.start.getTokenIndex());
if(hiddenTokens != null) { if(hiddenTokens != null) {
for(Token hiddenToken : hiddenTokens) { for(Token hiddenToken : hiddenTokens) {

View File

@ -1,4 +1,4 @@
import "c64" import "bgblacklib"
void main() { void main() {
*BGCOL = BLACK; *BGCOL = BLACK;
} }

View File

@ -0,0 +1,2 @@
const char* BGCOL = 0xd021;
const char BLACK = 0x00;

View File

@ -2,7 +2,6 @@
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
.label BGCOL = $d021 .label BGCOL = $d021
// The colors of the C64
.const BLACK = 0 .const BLACK = 0
main: { main: {
lda #BLACK lda #BLACK

View File

@ -1,30 +1,25 @@
Inlined call (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx
Culled Empty Block (label) @1
Culled Empty Block (label) @2
Culled Empty Block (label) @3
Culled Empty Block (label) @4
CONTROL FLOW GRAPH SSA CONTROL FLOW GRAPH SSA
@begin: scope:[] from @begin: scope:[] from
(byte*) BGCOL#0 ← ((byte*)) (number) $d021 (byte*) BGCOL#0 ← ((byte*)) (number) $d021
(byte) BLACK#0 ← (number) 0 (byte) BLACK#0 ← (number) 0
to:@5 to:@1
main: scope:[main] from @5 main: scope:[main] from @1
*((byte*) BGCOL#0) ← (byte) BLACK#0 *((byte*) BGCOL#0) ← (byte) BLACK#0
to:main::@return to:main::@return
main::@return: scope:[main] from main main::@return: scope:[main] from main
return return
to:@return to:@return
@5: scope:[] from @begin @1: scope:[] from @begin
call main call main
to:@6 to:@2
@6: scope:[] from @5 @2: scope:[] from @1
to:@end to:@end
@end: scope:[] from @6 @end: scope:[] from @2
SYMBOL TABLE SSA SYMBOL TABLE SSA
(label) @5 (label) @1
(label) @6 (label) @2
(label) @begin (label) @begin
(label) @end (label) @end
(byte*) BGCOL (byte*) BGCOL
@ -48,16 +43,15 @@ Constant (const byte*) BGCOL#0 = (byte*) 53281
Constant (const byte) BLACK#0 = 0 Constant (const byte) BLACK#0 = 0
Successful SSA optimization Pass2ConstantIdentification Successful SSA optimization Pass2ConstantIdentification
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @5 Adding NOP phi() at start of @1
Adding NOP phi() at start of @6 Adding NOP phi() at start of @2
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
CALL GRAPH CALL GRAPH
Calls in [] to main:2 Calls in [] to main:2
Created 0 initial phi equivalence classes Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes Coalesced down to 0 phi equivalence classes
Culled Empty Block (label) @6 Culled Empty Block (label) @2
Renumbering block @5 to @1
Adding NOP phi() at start of @begin Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1 Adding NOP phi() at start of @1
Adding NOP phi() at start of @end Adding NOP phi() at start of @end
@ -97,7 +91,6 @@ Target platform is c64basic
.pc = $80d "Program" .pc = $80d "Program"
// Global Constants & labels // Global Constants & labels
.label BGCOL = $d021 .label BGCOL = $d021
// The colors of the C64
.const BLACK = 0 .const BLACK = 0
// @begin // @begin
bbegin: bbegin:
@ -144,7 +137,6 @@ ASSEMBLER BEFORE OPTIMIZATION
.pc = $80d "Program" .pc = $80d "Program"
// Global Constants & labels // Global Constants & labels
.label BGCOL = $d021 .label BGCOL = $d021
// The colors of the C64
.const BLACK = 0 .const BLACK = 0
// @begin // @begin
bbegin: bbegin:
@ -214,7 +206,6 @@ Score: 12
.pc = $80d "Program" .pc = $80d "Program"
// Global Constants & labels // Global Constants & labels
.label BGCOL = $d021 .label BGCOL = $d021
// The colors of the C64
.const BLACK = 0 .const BLACK = 0
// @begin // @begin
// [1] phi from @begin to @1 [phi:@begin->@1] // [1] phi from @begin to @1 [phi:@begin->@1]