class Parser extends ParseBase
This class implements an operator precedence parser. Errors are reported to the Environment object, if the error can't be resolved immediately, a SyntaxError exception is thrown.
Error recovery is implemented by catching Scanner.SyntaxError exceptions and discarding input scanner.tokens until an input token is reached that is possibly a legal continuation.
The parse tree that is constructed represents the input exactly (no rewrites to simpler forms). This is important if the resulting tree is to be used for code formatting in a programming environment. Currently only documentation comments are retained.
A parser owns several components (scanner, constant-parser, instruction-parser, annotations-parser) to which it delegates certain parsing responsibilities. This parser contains functions to parse the overall form of a class, and any members (fields, methods, inner-classes).
Syntax errors, should always be caught inside the parser for error recovery.
Modifier and Type | Class and Description |
---|---|
(package private) static class |
Parser.CompilerError
The main compile error for the parser
|
(package private) static interface |
Parser.Method |
(package private) static interface |
Parser.NameSupplier |
Modifier and Type | Field and Description |
---|---|
private ParserAnnotation |
annotParser
other parser components
|
(package private) ClassData |
cd |
private java.util.ArrayList<AnnotationData> |
clsAnnttns |
private java.util.ArrayList<ClassData> |
clsDataList |
private ParserCP |
cpParser |
(package private) CodeAttr |
curCode |
private CFVersion |
currentCFV |
private boolean |
explicitcp |
private ParserInstr |
instrParser |
private java.util.ArrayList<AnnotationData> |
memberAnnttns |
private ModuleAttr |
moduleAttribute |
private java.lang.String |
pkg |
private java.util.ArrayList<AnnotationData> |
pkgAnnttns |
private java.lang.String |
pkgPrefix |
protected ConstantPool |
pool |
Modifier | Constructor and Description |
---|---|
protected |
Parser(Environment sf,
CFVersion cfVersion)
Create a parser
|
Modifier and Type | Method and Description |
---|---|
private void |
checkReferenceIndex(int position,
Tables.ConstType defaultTag,
Tables.ConstType default2Tag)
Check the pair reference_kind:reference_index where reference_kind is any from:
REF_invokeVirtual, REF_newInvokeSpecial, REF_invokeStatic, REF_invokeSpecial, REF_invokeInterface
and reference_index is one of [Empty], Method or InterfaceMethod
There are possible entries:
ldc Dynamic REF_newInvokeSpecial:InterfaceMethod LdcConDyTwice."
|
private int |
countParams(ConstantPool.ConstCell sigCell)
Scan method's signature to determine size of parameters.
|
(package private) java.lang.String |
encodeClassString(java.lang.String classname) |
private void |
endClass()
End class
|
private void |
endModule()
End module
|
(package private) ClassData[] |
getClassesData() |
private void |
match(JasmTokens.Token open,
JasmTokens.Token close)
The match() method is used to quickly match opening
brackets (ie: '(', '{', or '[') with their closing
counter part.
|
private void |
parseClass(int mod)
Parse a class or interface declaration.
|
private void |
parseClasses(java.util.function.Consumer<java.util.ArrayList<ConstantPool.ConstCell>> classesConsumer)
Parse a list of classes belonging to the [NestMembers | PermittedSubclasses] entry
|
private void |
parseClassMembers() |
(package private) ConstantPool.ConstCell |
parseClassName(boolean uncond) |
private void |
parseConstDef()
Parse constant declaration
|
private void |
parseCPXBootstrapMethod()
Parse a (CPX based) BootstrapMethod entry.
|
private void |
parseField(int mod)
Parse a field.
|
(package private) void |
parseFile()
Parse an Jasm file.
|
(package private) java.lang.String |
parseIdent()
Parse an internal name: identifier.
|
private void |
parseInnerClass_s1(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass) |
private void |
parseInnerClass_s2(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass) |
private void |
parseInnerClass_s3(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass) |
private void |
parseInnerClass(int mod)
Parse an inner class.
|
(package private) Argument |
parseInt(int size)
Parse a signed integer of size bytes long.
|
private void |
parseJasmPackages()
Determines whether the JASM file is for a package-info class
or for a module-info class.
|
(package private) void |
parseLocVarDef()
Parse a local variable
|
(package private) void |
parseLocVarEnd() |
(package private) Argument |
parseLocVarRef() |
(package private) void |
parseMapItem(DataVector map) |
private void |
parseMethod(int mod)
Parse a method.
|
(package private) ConstantPool.ConstCell |
parseMethodHandle(Tables.SubTag subtag)
Parses a field or method reference for method handle.
|
private void |
parseModule()
Parse a module declaration.
|
private java.lang.String |
parseModuleName()
Parses a module name in a module statement(s)
|
(package private) ConstantPool.ConstCell |
parseName()
Parse an external name: CPINDEX, string, or identifier.
|
private void |
parseNestHost()
Parse a NestHost entry
|
private void |
parseRecord()
Parse the Record entry
|
(package private) Tables.SubTag |
parseSubtag()
Parses a sub-tag value in method handle.
|
private java.lang.String |
parseTypeName()
Parses a package or type name in a module statement(s)
|
(package private) Argument |
parseUInt(int size)
Parse an unsigned integer of size bytes long.
|
private void |
parseVersion() |
private void |
parseVersionPkg()
Parses version in package statements
|
private void |
pic_error() |
private void |
pic_tracecreate(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass) |
private java.lang.String |
prependPackage(java.lang.String className,
boolean uncond) |
private void |
recoverField()
Recover after a syntax error in a field.
|
private void |
recoverFile()
Recover after a syntax error in the file.
|
private java.util.HashSet<java.lang.String> |
scanList(Parser.Method scanMethod,
Parser.NameSupplier target,
java.lang.String err,
boolean onlyOneElement)
Scans the "to" or "with" part of ModuleStatement: exports PackageName [to ModuleName {, ModuleName}] ;,
opens packageName [to ModuleName {, ModuleName}] ;
provides TypeName with TypeName [,typeName] ;
uses TypeName;
: [ModuleName {, ModuleName}]; , [TypeName [,typeName]]; or TypeName;
|
private int |
scanModifier(int mod)
Parse the modifiers
|
(package private) int |
scanModifiers() |
private void |
scanRequires(java.util.function.BiConsumer<java.lang.String,java.lang.Integer> action)
Scans ModuleStatement: requires [transitive] [static] ModuleName ;
|
private void |
scanStatement(java.util.function.BiConsumer<java.lang.String,java.util.Set<java.lang.String>> action,
Parser.NameSupplier source,
Parser.NameSupplier target,
JasmTokens.Token startList,
boolean emptyListAllowed,
java.lang.String err)
Scans Module Statement(s):
exports packageName [to ModuleName {, ModuleName}] ;
opens packageName [to ModuleName {, ModuleName}] ;
provides TypeName with TypeName [,typeName] ;
|
private void |
scanStatement(java.util.function.Consumer<java.util.Set<java.lang.String>> action,
java.lang.String err)
Scans ModuleStatement: uses TypeName;
|
(package private) void |
setDebugFlags(boolean debugScanner,
boolean debugMembers,
boolean debugCP,
boolean debugAnnot,
boolean debugInstr) |
debugScan, debugStr, enableDebug, init
protected ConstantPool pool
ClassData cd
CodeAttr curCode
private java.util.ArrayList<ClassData> clsDataList
private java.lang.String pkg
private java.lang.String pkgPrefix
private java.util.ArrayList<AnnotationData> pkgAnnttns
private java.util.ArrayList<AnnotationData> clsAnnttns
private java.util.ArrayList<AnnotationData> memberAnnttns
private boolean explicitcp
private ModuleAttr moduleAttribute
private CFVersion currentCFV
private ParserAnnotation annotParser
private ParserCP cpParser
private ParserInstr instrParser
protected Parser(Environment sf, CFVersion cfVersion) throws java.io.IOException
java.io.IOException
void setDebugFlags(boolean debugScanner, boolean debugMembers, boolean debugCP, boolean debugAnnot, boolean debugInstr)
java.lang.String encodeClassString(java.lang.String classname)
private void parseVersionPkg() throws java.io.IOException
java.io.IOException
private void parseVersion() throws java.io.IOException
java.io.IOException
java.lang.String parseIdent() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
void parseLocVarDef() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
Argument parseLocVarRef() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
void parseLocVarEnd() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
void parseMapItem(DataVector map) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
ConstantPool.ConstCell parseName() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
ConstantPool.ConstCell parseMethodHandle(Tables.SubTag subtag) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void checkReferenceIndex(int position, Tables.ConstType defaultTag, Tables.ConstType default2Tag)
position
- the position in a source filedefaultTag
- expected reference_index tag (Method or InterfaceMethod)defaultTag
- 2nd expected reference_index tag (Method or InterfaceMethod)Tables.SubTag parseSubtag() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
ConstantPool.ConstCell parseClassName(boolean uncond) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private java.lang.String prependPackage(java.lang.String className, boolean uncond)
Argument parseInt(int size) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
Argument parseUInt(int size) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseConstDef() throws java.io.IOException
java.io.IOException
private int scanModifier(int mod) throws java.io.IOException
java.io.IOException
int scanModifiers() throws java.io.IOException
java.io.IOException
private void parseField(int mod) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private int countParams(ConstantPool.ConstCell sigCell) throws Scanner.SyntaxError
Scanner.SyntaxError
private void parseMethod(int mod) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseCPXBootstrapMethod() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseNestHost() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseClasses(java.util.function.Consumer<java.util.ArrayList<ConstantPool.ConstCell>> classesConsumer) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseRecord() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseInnerClass(int mod) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseInnerClass_s1(int mod, ConstantPool.ConstCell nameCell, ConstantPool.ConstCell innerClass, ConstantPool.ConstCell outerClass) throws java.io.IOException
java.io.IOException
private void parseInnerClass_s2(int mod, ConstantPool.ConstCell nameCell, ConstantPool.ConstCell innerClass, ConstantPool.ConstCell outerClass) throws java.io.IOException
java.io.IOException
private void parseInnerClass_s3(int mod, ConstantPool.ConstCell nameCell, ConstantPool.ConstCell innerClass, ConstantPool.ConstCell outerClass) throws java.io.IOException
java.io.IOException
private void pic_tracecreate(int mod, ConstantPool.ConstCell nameCell, ConstantPool.ConstCell innerClass, ConstantPool.ConstCell outerClass)
private void pic_error()
private void match(JasmTokens.Token open, JasmTokens.Token close) throws java.io.IOException
Scan to a matching '}', ']' or ')'. The current scanner.token must be a '{', '[' or '(';
java.io.IOException
private void recoverField() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxError
java.io.IOException
private void parseClass(int mod) throws java.io.IOException
java.io.IOException
private java.lang.String parseTypeName() throws java.io.IOException
java.io.IOException
private java.lang.String parseModuleName() throws java.io.IOException
java.io.IOException
private void parseModule() throws java.io.IOException
java.io.IOException
private void scanRequires(java.util.function.BiConsumer<java.lang.String,java.lang.Integer> action) throws java.io.IOException
java.io.IOException
private void scanStatement(java.util.function.Consumer<java.util.Set<java.lang.String>> action, java.lang.String err) throws java.io.IOException
java.io.IOException
private void scanStatement(java.util.function.BiConsumer<java.lang.String,java.util.Set<java.lang.String>> action, Parser.NameSupplier source, Parser.NameSupplier target, JasmTokens.Token startList, boolean emptyListAllowed, java.lang.String err) throws java.io.IOException
java.io.IOException
private java.util.HashSet<java.lang.String> scanList(Parser.Method scanMethod, Parser.NameSupplier target, java.lang.String err, boolean onlyOneElement) throws java.io.IOException
java.io.IOException
private void parseClassMembers() throws java.io.IOException
java.io.IOException
private void recoverFile() throws java.io.IOException
java.io.IOException
private void endClass()
private void endModule()
final ClassData[] getClassesData()
private void parseJasmPackages() throws java.io.IOException
creates the correct kind of ClassData accordingly.
java.io.IOException
void parseFile()