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, initprotected 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.IOExceptionvoid 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.IOExceptionprivate void parseVersion()
throws java.io.IOException
java.io.IOExceptionjava.lang.String parseIdent()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionvoid parseLocVarDef()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionArgument parseLocVarRef() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionvoid parseLocVarEnd()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionvoid parseMapItem(DataVector map) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionConstantPool.ConstCell parseName() throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionConstantPool.ConstCell parseMethodHandle(Tables.SubTag subtag) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate 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.SyntaxErrorjava.io.IOExceptionConstantPool.ConstCell parseClassName(boolean uncond) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate java.lang.String prependPackage(java.lang.String className,
boolean uncond)
Argument parseInt(int size) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionArgument parseUInt(int size) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseConstDef()
throws java.io.IOException
java.io.IOExceptionprivate int scanModifier(int mod)
throws java.io.IOException
java.io.IOExceptionint scanModifiers()
throws java.io.IOException
java.io.IOExceptionprivate void parseField(int mod)
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate int countParams(ConstantPool.ConstCell sigCell) throws Scanner.SyntaxError
Scanner.SyntaxErrorprivate void parseMethod(int mod)
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseCPXBootstrapMethod()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseNestHost()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseClasses(java.util.function.Consumer<java.util.ArrayList<ConstantPool.ConstCell>> classesConsumer) throws Scanner.SyntaxError, java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseRecord()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseInnerClass(int mod)
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseInnerClass_s1(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass)
throws java.io.IOException
java.io.IOExceptionprivate void parseInnerClass_s2(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass)
throws java.io.IOException
java.io.IOExceptionprivate void parseInnerClass_s3(int mod,
ConstantPool.ConstCell nameCell,
ConstantPool.ConstCell innerClass,
ConstantPool.ConstCell outerClass)
throws java.io.IOException
java.io.IOExceptionprivate 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.IOExceptionprivate void recoverField()
throws Scanner.SyntaxError,
java.io.IOException
Scanner.SyntaxErrorjava.io.IOExceptionprivate void parseClass(int mod)
throws java.io.IOException
java.io.IOExceptionprivate java.lang.String parseTypeName()
throws java.io.IOException
java.io.IOExceptionprivate java.lang.String parseModuleName()
throws java.io.IOException
java.io.IOExceptionprivate void parseModule()
throws java.io.IOException
java.io.IOExceptionprivate void scanRequires(java.util.function.BiConsumer<java.lang.String,java.lang.Integer> action)
throws java.io.IOException
java.io.IOExceptionprivate void scanStatement(java.util.function.Consumer<java.util.Set<java.lang.String>> action,
java.lang.String err)
throws java.io.IOException
java.io.IOExceptionprivate 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.IOExceptionprivate 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.IOExceptionprivate void parseClassMembers()
throws java.io.IOException
java.io.IOExceptionprivate void recoverFile()
throws java.io.IOException
java.io.IOExceptionprivate void endClass()
private void endModule()
final ClassData[] getClassesData()
private void parseJasmPackages()
throws java.io.IOException
creates the correct kind of ClassData accordingly.
java.io.IOExceptionvoid parseFile()