src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java

Print this page




  37 import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX;
  38 import static jdk.nashorn.internal.parser.TokenType.DECPREFIX;
  39 import static jdk.nashorn.internal.parser.TokenType.ELSE;
  40 import static jdk.nashorn.internal.parser.TokenType.EOF;
  41 import static jdk.nashorn.internal.parser.TokenType.EOL;
  42 import static jdk.nashorn.internal.parser.TokenType.FINALLY;
  43 import static jdk.nashorn.internal.parser.TokenType.FUNCTION;
  44 import static jdk.nashorn.internal.parser.TokenType.IDENT;
  45 import static jdk.nashorn.internal.parser.TokenType.IF;
  46 import static jdk.nashorn.internal.parser.TokenType.INCPOSTFIX;
  47 import static jdk.nashorn.internal.parser.TokenType.LBRACE;
  48 import static jdk.nashorn.internal.parser.TokenType.LET;
  49 import static jdk.nashorn.internal.parser.TokenType.LPAREN;
  50 import static jdk.nashorn.internal.parser.TokenType.RBRACE;
  51 import static jdk.nashorn.internal.parser.TokenType.RBRACKET;
  52 import static jdk.nashorn.internal.parser.TokenType.RPAREN;
  53 import static jdk.nashorn.internal.parser.TokenType.SEMICOLON;
  54 import static jdk.nashorn.internal.parser.TokenType.TERNARY;
  55 import static jdk.nashorn.internal.parser.TokenType.WHILE;
  56 

  57 import java.util.ArrayDeque;
  58 import java.util.ArrayList;
  59 import java.util.Collections;
  60 import java.util.Deque;
  61 import java.util.HashMap;
  62 import java.util.HashSet;
  63 import java.util.Iterator;
  64 import java.util.List;
  65 import java.util.Map;
  66 import jdk.internal.dynalink.support.NameCodec;
  67 import jdk.nashorn.internal.codegen.CompilerConstants;
  68 import jdk.nashorn.internal.codegen.Namespace;
  69 import jdk.nashorn.internal.ir.AccessNode;
  70 import jdk.nashorn.internal.ir.BaseNode;
  71 import jdk.nashorn.internal.ir.BinaryNode;
  72 import jdk.nashorn.internal.ir.Block;
  73 import jdk.nashorn.internal.ir.BlockLexicalContext;
  74 import jdk.nashorn.internal.ir.BlockStatement;
  75 import jdk.nashorn.internal.ir.BreakNode;
  76 import jdk.nashorn.internal.ir.BreakableNode;


2960         final ParserState parserState = (ParserState)data.getEndParserState();
2961         assert parserState != null;
2962 
2963         stream.reset();
2964         lexer = parserState.createLexer(source, lexer, stream, scripting && !env._no_syntax_extensions);
2965         line = parserState.line;
2966         linePosition = parserState.linePosition;
2967         // Doesn't really matter, but it's safe to treat it as if there were a semicolon before
2968         // the RBRACE.
2969         type = SEMICOLON;
2970         k = -1;
2971         next();
2972 
2973         return true;
2974     }
2975 
2976     /**
2977      * Encapsulates part of the state of the parser, enough to reconstruct the state of both parser and lexer
2978      * for resuming parsing after skipping a function body.
2979      */
2980     private static class ParserState {
2981         private final int position;
2982         private final int line;
2983         private final int linePosition;


2984 
2985         ParserState(final int position, final int line, final int linePosition) {
2986             this.position = position;
2987             this.line = line;
2988             this.linePosition = linePosition;
2989         }
2990 
2991         Lexer createLexer(final Source source, final Lexer lexer, final TokenStream stream, final boolean scripting) {
2992             final Lexer newLexer = new Lexer(source, position, lexer.limit - position, stream, scripting, true);
2993             newLexer.restoreState(new Lexer.State(position, Integer.MAX_VALUE, line, -1, linePosition, SEMICOLON));
2994             return newLexer;
2995         }
2996     }
2997 
2998     private void printAST(final FunctionNode functionNode) {
2999         if (functionNode.getFlag(FunctionNode.IS_PRINT_AST)) {
3000             env.getErr().println(new ASTWriter(functionNode));
3001         }
3002 
3003         if (functionNode.getFlag(FunctionNode.IS_PRINT_PARSE)) {




  37 import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX;
  38 import static jdk.nashorn.internal.parser.TokenType.DECPREFIX;
  39 import static jdk.nashorn.internal.parser.TokenType.ELSE;
  40 import static jdk.nashorn.internal.parser.TokenType.EOF;
  41 import static jdk.nashorn.internal.parser.TokenType.EOL;
  42 import static jdk.nashorn.internal.parser.TokenType.FINALLY;
  43 import static jdk.nashorn.internal.parser.TokenType.FUNCTION;
  44 import static jdk.nashorn.internal.parser.TokenType.IDENT;
  45 import static jdk.nashorn.internal.parser.TokenType.IF;
  46 import static jdk.nashorn.internal.parser.TokenType.INCPOSTFIX;
  47 import static jdk.nashorn.internal.parser.TokenType.LBRACE;
  48 import static jdk.nashorn.internal.parser.TokenType.LET;
  49 import static jdk.nashorn.internal.parser.TokenType.LPAREN;
  50 import static jdk.nashorn.internal.parser.TokenType.RBRACE;
  51 import static jdk.nashorn.internal.parser.TokenType.RBRACKET;
  52 import static jdk.nashorn.internal.parser.TokenType.RPAREN;
  53 import static jdk.nashorn.internal.parser.TokenType.SEMICOLON;
  54 import static jdk.nashorn.internal.parser.TokenType.TERNARY;
  55 import static jdk.nashorn.internal.parser.TokenType.WHILE;
  56 
  57 import java.io.Serializable;
  58 import java.util.ArrayDeque;
  59 import java.util.ArrayList;
  60 import java.util.Collections;
  61 import java.util.Deque;
  62 import java.util.HashMap;
  63 import java.util.HashSet;
  64 import java.util.Iterator;
  65 import java.util.List;
  66 import java.util.Map;
  67 import jdk.internal.dynalink.support.NameCodec;
  68 import jdk.nashorn.internal.codegen.CompilerConstants;
  69 import jdk.nashorn.internal.codegen.Namespace;
  70 import jdk.nashorn.internal.ir.AccessNode;
  71 import jdk.nashorn.internal.ir.BaseNode;
  72 import jdk.nashorn.internal.ir.BinaryNode;
  73 import jdk.nashorn.internal.ir.Block;
  74 import jdk.nashorn.internal.ir.BlockLexicalContext;
  75 import jdk.nashorn.internal.ir.BlockStatement;
  76 import jdk.nashorn.internal.ir.BreakNode;
  77 import jdk.nashorn.internal.ir.BreakableNode;


2961         final ParserState parserState = (ParserState)data.getEndParserState();
2962         assert parserState != null;
2963 
2964         stream.reset();
2965         lexer = parserState.createLexer(source, lexer, stream, scripting && !env._no_syntax_extensions);
2966         line = parserState.line;
2967         linePosition = parserState.linePosition;
2968         // Doesn't really matter, but it's safe to treat it as if there were a semicolon before
2969         // the RBRACE.
2970         type = SEMICOLON;
2971         k = -1;
2972         next();
2973 
2974         return true;
2975     }
2976 
2977     /**
2978      * Encapsulates part of the state of the parser, enough to reconstruct the state of both parser and lexer
2979      * for resuming parsing after skipping a function body.
2980      */
2981     private static class ParserState implements Serializable {
2982         private final int position;
2983         private final int line;
2984         private final int linePosition;
2985 
2986         private static final long serialVersionUID = -2382565130754093694L;
2987 
2988         ParserState(final int position, final int line, final int linePosition) {
2989             this.position = position;
2990             this.line = line;
2991             this.linePosition = linePosition;
2992         }
2993 
2994         Lexer createLexer(final Source source, final Lexer lexer, final TokenStream stream, final boolean scripting) {
2995             final Lexer newLexer = new Lexer(source, position, lexer.limit - position, stream, scripting, true);
2996             newLexer.restoreState(new Lexer.State(position, Integer.MAX_VALUE, line, -1, linePosition, SEMICOLON));
2997             return newLexer;
2998         }
2999     }
3000 
3001     private void printAST(final FunctionNode functionNode) {
3002         if (functionNode.getFlag(FunctionNode.IS_PRINT_AST)) {
3003             env.getErr().println(new ASTWriter(functionNode));
3004         }
3005 
3006         if (functionNode.getFlag(FunctionNode.IS_PRINT_PARSE)) {