public class Parser
extends java.lang.Object
The various parseX() methods never return null - even when parse errors are encountered. Typically parseX() will return a XTree ParseTree. Each ParseTree that is created includes its source location. The typical pattern for a parseX() method is:
XTree parseX() { SourcePosition start = getTreeStartLocation(); parse X grammar element and its children return new XTree(getTreeLocation(start), children); }
parseX() methods must consume at least 1 token - even in error cases. This prevents infinite loops in the parser.
Many parseX() methods are matched by a 'boolean peekX()' method which will return true if the beginning of an X appears at the current location. There are also peek() methods which examine the next token. peek() methods must not consume any tokens.
The eat() method consumes a token and reports an error if the consumed token is not of the expected type. The eatOpt() methods consume the next token iff the next token is of the expected type and return the consumed token or null if no token was consumed.
When parse errors are encountered, an error should be reported and the parse should return a best guess at the current parse tree.
When parsing lists, the preferred pattern is:
eat(LIST_START); ImmutableList.Builder<ParseTree> elements = ImmutableList.builder(); while (peekListElement()) { elements.add(parseListElement()); } eat(LIST_END);
Modifier and Type | Class and Description |
---|---|
private static class |
Parser.CommentRecorder |
static class |
Parser.Config |
private static class |
Parser.Expression
Differentiates between parsing for 'In' vs.
|
private static class |
Parser.ParamContext |
private static class |
Parser.PatternKind |
Modifier and Type | Field and Description |
---|---|
private Parser.CommentRecorder |
commentRecorder |
private Parser.Config |
config |
private ErrorReporter |
errorReporter |
private FeatureSet |
features |
private ArrayDeque<java.lang.Boolean> |
inGeneratorContext |
private Token |
lastToken |
private Scanner |
scanner |
Constructor and Description |
---|
Parser(Parser.Config config,
ErrorReporter errorReporter,
SourceFile source) |
Parser(Parser.Config config,
ErrorReporter errorReporter,
SourceFile source,
int offset) |
Parser(Parser.Config config,
ErrorReporter errorReporter,
SourceFile source,
int offset,
boolean initialGeneratorContext) |
private final Scanner scanner
private final ErrorReporter errorReporter
private Token lastToken
private final Parser.Config config
private final Parser.CommentRecorder commentRecorder
private final ArrayDeque<java.lang.Boolean> inGeneratorContext
private FeatureSet features
public Parser(Parser.Config config, ErrorReporter errorReporter, SourceFile source, int offset, boolean initialGeneratorContext)
public Parser(Parser.Config config, ErrorReporter errorReporter, SourceFile source, int offset)
public Parser(Parser.Config config, ErrorReporter errorReporter, SourceFile source)
public java.util.List<Comment> getComments()
public FeatureSet getFeatures()
public ProgramTree parseProgram()
private com.google.common.collect.ImmutableList<ParseTree> parseGlobalSourceElements()
private com.google.common.collect.ImmutableList<ParseTree> parseNamespaceElements()
private com.google.common.collect.ImmutableList<ParseTree> parseAmbientNamespaceElements()
private ParseTree parseScriptElement()
private ParseTree parseAmbientNamespaceElement()
private boolean peekImportDeclaration()
private ParseTree parseImportDeclaration()
private com.google.common.collect.ImmutableList<ParseTree> parseImportSpecifierSet()
private ParseTree parseImportSpecifier()
private boolean peekExportDeclaration()
private ParseTree parseExportDeclaration(boolean isAmbient)
private com.google.common.collect.ImmutableList<ParseTree> parseExportSpecifierSet()
private ParseTree parseExportSpecifier()
private boolean peekClassDeclaration()
private boolean peekInterfaceDeclaration()
private boolean peekEnumDeclaration()
private boolean peekNamespaceDeclaration()
private ParseTree parseClassDeclaration(boolean isAmbient)
private ParseTree parseClassExpression()
private ParseTree parseInterfaceDeclaration()
private com.google.common.collect.ImmutableList<ParseTree> parseInterfaceElements()
private boolean peekInterfaceElement()
private ParseTree parseInterfaceElement()
private ParseTree parseEnumDeclaration()
private com.google.common.collect.ImmutableList<ParseTree> parseEnumMembers()
private ParseTree parseClass(boolean isExpression, boolean isAmbient)
private com.google.common.collect.ImmutableList<ParseTree> parseClassElements(boolean isAmbient)
private boolean peekClassElement()
private ParseTree parseClassElement(boolean isAmbient)
private ParseTree parseClassMemberDeclaration(boolean allowStatic, boolean isAmbient, TokenType access)
private FunctionDeclarationTree parseMethodSignature(SourcePosition start, IdentifierToken name, boolean isStatic, boolean isGenerator, boolean isOptional, TokenType access)
private FunctionDeclarationTree parseAmbientFunctionDeclaration(SourcePosition start, IdentifierToken name, boolean isGenerator)
private FunctionDeclarationTree parseFunctionTail(SourcePosition start, IdentifierToken name, boolean isStatic, boolean isGenerator, TokenType access, FunctionDeclarationTree.Kind kind)
private NamespaceDeclarationTree parseNamespaceDeclaration(boolean isAmbient)
private NamespaceNameTree parseNamespaceName()
private ParseTree parseSourceElement()
private boolean peekSourceElement()
private boolean peekFunction()
private boolean peekDeclaration()
private boolean peekTypeAlias()
private boolean peekIndexSignature()
private IndexSignatureTree parseIndexSignature()
private CallSignatureTree parseCallSignature(boolean isNew)
private boolean peekAmbientDeclaration()
private boolean peekAmbientNamespaceElement()
private boolean peekFunction(int index)
private ParseTree parseArrowFunctionTail(SourcePosition start, GenericTypeListTree generics, FormalParameterListTree formalParameterList, Parser.Expression expressionIn)
private boolean peekFunctionTypeExpression()
private ParseTree parseFunctionDeclaration()
private ParseTree parseFunctionExpression()
private ParseTree parseAmbientFunctionDeclaration()
private boolean peekParameter(Parser.ParamContext context)
private ParseTree parseParameter(Parser.ParamContext context)
private FormalParameterListTree parseFormalParameterList(Parser.ParamContext context)
private ParseTree parseTypeAnnotation()
private ParseTree parseType()
private ParseTree parseFunctionTypeExpression()
private ParseTree parseArrayTypeExpression()
private ParseTree parseParenTypeExpression()
private ParseTree parseRecordTypeExpression()
private ParseTree parseTypeQuery()
private ParseTree parseTypeReference()
private ParseTree parseTypeArgumentList(SourcePosition start, TypeNameTree typeName)
private TypeNameTree parseTypeName()
private com.google.common.collect.ImmutableList<java.lang.String> buildIdentifierPath(IdentifierToken token)
private BlockTree parseFunctionBody()
private com.google.common.collect.ImmutableList<ParseTree> parseSourceElementList()
private SpreadExpressionTree parseSpreadExpression()
private ParseTree parseStatement()
private ParseTree parseStatementStandard()
private boolean peekStatement()
private boolean peekStatementStandard()
private BlockTree parseBlock()
private com.google.common.collect.ImmutableList<ParseTree> parseStatementList()
private VariableStatementTree parseVariableStatement()
private VariableDeclarationListTree parseVariableDeclarationList()
private VariableDeclarationListTree parseVariableDeclarationListNoIn()
private VariableDeclarationListTree parseAmbientVariableDeclarationList()
private VariableDeclarationListTree parseVariableDeclarationList(Parser.Expression expressionIn)
private VariableDeclarationTree parseVariableDeclaration(TokenType binding, Parser.Expression expressionIn)
private ParseTree parseInitializer(Parser.Expression expressionIn)
private EmptyStatementTree parseEmptyStatement()
private ExpressionStatementTree parseExpressionStatement()
private IfStatementTree parseIfStatement()
private ParseTree parseDoWhileStatement()
private ParseTree parseWhileStatement()
private ParseTree parseForStatement()
private ParseTree parseForOfStatement(SourcePosition start, ParseTree initializer)
private void checkVanillaForInitializers(VariableDeclarationListTree variables)
private void maybeReportNoInitializer(TokenType token, ParseTree lvalue)
private boolean peekVariableDeclarationList()
private ParseTree parseForStatement(SourcePosition start, ParseTree initializer)
private ParseTree parseForInStatement(SourcePosition start, ParseTree initializer)
private ParseTree parseContinueStatement()
private ParseTree parseBreakStatement()
private ParseTree parseReturnStatement()
private ParseTree parseWithStatement()
private ParseTree parseSwitchStatement()
private com.google.common.collect.ImmutableList<ParseTree> parseCaseClauses()
private com.google.common.collect.ImmutableList<ParseTree> parseCaseStatementsOpt()
private ParseTree parseLabelledStatement()
private boolean peekLabelledStatement()
private ParseTree parseThrowStatement()
private ParseTree parseTryStatement()
private CatchTree parseCatch()
private FinallyTree parseFinallyBlock()
private ParseTree parseDebuggerStatement()
private ParseTree parsePrimaryExpression()
private SuperExpressionTree parseSuperExpression()
private ThisExpressionTree parseThisExpression()
private IdentifierExpressionTree parseIdentifierExpression()
private LiteralExpressionTree parseLiteralExpression()
private TemplateLiteralExpressionTree parseTemplateLiteral(ParseTree operand)
We store this operand in the TemplateLiteralExpressionTree and generate a TAGGED_TEMPLATELIT node if it's not null later when transpiling.
operand
- A non-null value would represent the callsiteprivate Token nextLiteralToken()
private ParseTree parseRegularExpressionLiteral()
private ParseTree parseArrayInitializer()
private ParseTree parseGeneratorComprehension()
private ParseTree parseArrayComprehension()
private ParseTree parseComprehension(ComprehensionTree.ComprehensionType type, TokenType startToken, TokenType endToken)
private ParseTree parseComprehensionFor()
private ParseTree parseComprehensionIf()
private ParseTree parseArrayLiteral()
private ParseTree parseObjectLiteral()
void maybeReportTrailingComma(Token commaToken)
private boolean peekPropertyNameOrComputedProp(int tokenIndex)
private boolean peekPropertyName(int tokenIndex)
private ParseTree parsePropertyAssignment()
private ParseTree parsePropertyAssignmentGenerator()
private ParseTree parseComputedPropertyName()
private boolean peekGetAccessor(boolean allowStatic)
private boolean peekPredefinedString(java.lang.String string)
private Token eatPredefinedString(java.lang.String string)
private boolean peekPredefinedString(int index, java.lang.String string)
private boolean peekSetAccessor(boolean allowStatic)
private ParseTree parsePropertyNameAssignment()
private ParseTree parseCoverParenthesizedExpressionAndArrowParameterList()
private ParseTree parseMissingPrimaryExpression()
private GenericTypeListTree maybeParseGenericTypes()
private ParseTree maybeParseColonType()
private ParseTree parseExpressionNoIn()
private ParseTree parseExpression()
private boolean peekExpression()
private ParseTree parse(Parser.Expression expressionIn)
private ParseTree parseAssignmentExpression()
private boolean peekAssignmentExpression()
private ParseTree parseAssignment(Parser.Expression expressionIn)
private FormalParameterListTree transformArrowFunctionParameters(SourcePosition start, ParseTree tree)
private ParseTree transformLeftHandSideExpression(ParseTree tree)
private ParseTree parseLeftHandSidePattern()
private void resetScanner(ParseTree tree)
private boolean peekAssignmentOperator()
private boolean inGeneratorContext()
private ParseTree parseYield(Parser.Expression expressionIn)
private ParseTree parseConditional(Parser.Expression expressionIn)
private ParseTree parseLogicalOR(Parser.Expression expressionIn)
private ParseTree parseLogicalAND(Parser.Expression expressionIn)
private ParseTree parseBitwiseOR(Parser.Expression expressionIn)
private ParseTree parseBitwiseXOR(Parser.Expression expressionIn)
private ParseTree parseBitwiseAND(Parser.Expression expressionIn)
private ParseTree parseEquality(Parser.Expression expressionIn)
private boolean peekEqualityOperator()
private ParseTree parseRelational(Parser.Expression expressionIn)
private boolean peekRelationalOperator(Parser.Expression expressionIn)
private ParseTree parseShiftExpression()
private boolean peekShiftOperator()
private ParseTree parseAdditiveExpression()
private boolean peekAdditiveOperator()
private ParseTree parseMultiplicativeExpression()
private boolean peekMultiplicativeOperator()
private ParseTree parseUnaryExpression()
private boolean peekUnaryOperator()
private ParseTree parsePostfixExpression()
private boolean peekPostfixOperator()
private ParseTree parseLeftHandSideExpression()
private boolean peekCallSuffix()
private ParseTree parseMemberExpressionNoNew()
private boolean peekMemberExpressionSuffix()
private ParseTree parseNewExpression()
private ArgumentListTree parseArguments()
private boolean peekAssignmentOrSpread()
This does not peek the operand for the spread expression. This means that
parseAssignmentOrSpread()
might still fail when this returns true.
private ParseTree parseAssignmentOrSpread()
private boolean peekPatternStart()
private ParseTree parsePattern(Parser.PatternKind kind)
private boolean peekPatternElement()
private ParseTree parseArrayPatternElement(Parser.PatternKind kind)
private ParseTree parseArrayPattern(Parser.PatternKind kind)
private ParseTree parseObjectPattern(Parser.PatternKind kind)
private boolean peekObjectPatternField()
private ParseTree parseObjectPatternField(Parser.PatternKind kind)
private ParseTree parseObjectPatternFieldTail(Parser.PatternKind kind)
private ParseTree parseTypeAlias()
private ParseTree parseAmbientDeclaration()
private ParseTree parseAmbientDeclarationHelper()
private void eatPossibleImplicitSemiColon()
private boolean peekImplicitSemiColon()
private boolean peekImplicitSemiColon(int index)
private int getLastLine()
private int getNextLine()
private Token eatOpt(TokenType expectedTokenType)
expectedTokenType
- private boolean inStrictContext()
private boolean peekId()
private boolean peekId(int index)
private boolean peekIdOrKeyword()
private boolean peekAccessibilityModifier()
private TokenType maybeParseAccessibilityModifier()
private IdentifierToken eatIdOpt()
private IdentifierToken eatId()
private Token eatObjectLiteralPropertyName()
private IdentifierToken eatIdOrKeywordAsId()
private Token eat(TokenType expectedTokenType)
expectedTokenType
- private void reportExpectedError(Token token, java.lang.Object expected)
token
- The location to report the message at.expected
- The thing that was expected.private SourcePosition getTreeStartLocation()
private SourcePosition getTreeEndLocation()
private SourceRange getTreeLocation(SourcePosition start)
private Token nextToken()
Tokenizing is contextual. nextToken() will never return a regular expression literal.
private LiteralToken nextRegularExpressionLiteralToken()
private LiteralToken nextTemplateLiteralToken()
private boolean peek(TokenType expectedType)
private boolean peek(int index, TokenType expectedType)
private TokenType peekType()
private TokenType peekType(int index)
private Token peekToken()
private Token peekToken(int index)
@Deprecated private Parser createLookaheadParser()
private void reportError(Token token, java.lang.String message, java.lang.Object... arguments)
token
- The location to report the message at.message
- The message to report in String.format style.arguments
- The arguments to fill in the message format.private void reportError(java.lang.String message, java.lang.Object... arguments)
message
- The message to report in String.format style.arguments
- The arguments to fill in the message format.