⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexerautomaton.java

📁 用JAVA写的shell程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// JShell
// Copyright (C) 2000 Jack A. Orenstein
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
// 02111-1307, USA.
// 
// Jack A. Orenstein  jao@mediaone.net

package jshell.commandline;

import jshell.*;
import jshell.util.*;

class LexerAutomaton
{
    public LexerAutomaton()
    {
        setup_transitions();
        _token = new StringBuffer();
        reset();
    }

    public void reset()
    {
        if (TRACE)
            System.out.println
                ("Resetting LexerAutomaton to S_UNKNOWN");

        _token.setLength(0);
        _state = S_UNKNOWN;
        _token_type = Lexer.NONE;
    }

    public void accept(char c)
    {
        _char = c;
        classify();
        int original_state = _state;
        Transition transition =
            _transition[_state][_char_classification];
        if (transition == null)
            transition = _transition[_state][I_DEFAULT];
        transition.apply();

        if (TRACE)
        {
            System.out.println
                (state_name(original_state)+
                 " + '"+
                 _char+"' ("+
                 char_classification_name(_char_classification)+
                 ") -> "+
                 state_name(_state));
        }
    }

    public boolean inEndState()
    {
        return _state == S_DONE;
    }

    public int tokenType()
    {
        Assertion.check(inEndState());
        return _token_type;
    }

    public String token()
    {
        Assertion.check(inEndState());
        return _token.toString();
    }

    private void classify()
    {
        switch (_char)
        {
            case '^':
                _char_classification = I_HAT;
                break;

            case '<':
                _char_classification = I_LT;
                break;

            case '>':
                _char_classification = I_GT;
                break;

            case ';':
                _char_classification = I_SEMI;
                break;

            case '$':
                _char_classification = I_DOLLAR;
                break;

            case ' ':
            case '\t':
            case '\n':
            case '\r':
                _char_classification = I_WHITESPACE;
                break;

            case '\'':
                _char_classification = I_SINGLE_QUOTE;
                break;

            case '"':
                _char_classification = I_DOUBLE_QUOTE;
                break;

            case '\\':
                _char_classification = I_ESCAPE;
                break;

            case '&':
                _char_classification = I_AMPERSAND;
                break;

            case '!':
                _char_classification = I_BANG;
                break;

            case (char) -1:
                _char_classification = I_EOL;
                break;

            default:
                _char_classification = I_OTHER;
                break;
        }
    }

    private void setup_transitions()
    {
        _transition = new Transition[N_STATES][];
        Transition[] state_transition;

        // S_UNKNOWN
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_HAT]          = new Transition_UNKNOWN_HAT();
        state_transition[I_LT]           = new Transition_UNKNOWN_LT();
        state_transition[I_GT]           = new Transition_UNKNOWN_GT();
        state_transition[I_SEMI]         = new Transition_UNKNOWN_SEMI();
        state_transition[I_DOLLAR]       = new Transition_UNKNOWN_DOLLAR();
        state_transition[I_SINGLE_QUOTE] = new Transition_UNKNOWN_QUOTE_1();
        state_transition[I_DOUBLE_QUOTE] = new Transition_UNKNOWN_QUOTE_2();
        state_transition[I_WHITESPACE]   = new Transition_UNKNOWN_WHITESPACE();
        state_transition[I_AMPERSAND]    = new Transition_UNKNOWN_AMPERSAND();
        state_transition[I_ESCAPE   ]    = new Transition_UNKNOWN_ESCAPE();
        state_transition[I_EOL]          = new Transition_UNKNOWN_EOL();
        state_transition[I_BANG]         = new Transition_UNKNOWN_BANG();
        state_transition[I_DEFAULT]      = new Transition_UNKNOWN_DEFAULT();
        _transition[S_UNKNOWN] = state_transition;

        // S_PIPE
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_PIPE_DEFAULT();
        _transition[S_PIPE] = state_transition;

        // S_REDIRECT_IN
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_REDIRECT_IN_DEFAULT();
        _transition[S_REDIRECT_IN] = state_transition;

        // S_REDIRECT_OUT
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_GT]           = new Transition_REDIRECT_OUT_GT();
        state_transition[I_DEFAULT]      = new Transition_REDIRECT_OUT_DEFAULT();
        _transition[S_REDIRECT_OUT] = state_transition;

        // S_SEPARATOR
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_AMPERSAND]    = new Transition_SEPARATOR_AMPERSAND();
        state_transition[I_DEFAULT]      = new Transition_SEPARATOR_DEFAULT();
        _transition[S_SEPARATOR] = state_transition;

        // S_VARIABLE
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_OTHER]        = new Transition_VARIABLE_OTHER();
        state_transition[I_DEFAULT]      = new Transition_VARIABLE_DEFAULT();
        _transition[S_VARIABLE] = state_transition;

        // S_STRING
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_ESCAPE]       = new Transition_STRING_ESCAPE();
        state_transition[I_AMPERSAND]    = new Transition_STRING_AMPERSAND();
        state_transition[I_OTHER]        = new Transition_STRING_OTHER();
        state_transition[I_DEFAULT]      = new Transition_STRING_DEFAULT();
        _transition[S_STRING] = state_transition;

        // S_QUOTE_1
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_QUOTE_1_DEFAULT();
        _transition[S_QUOTE_1] = state_transition;

        // S_QUOTE_2
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_QUOTE_2_DEFAULT();
        _transition[S_QUOTE_2] = state_transition;

        // S_APPEND
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_APPEND_DEFAULT();
        _transition[S_APPEND] = state_transition;

        // S_VARIABLE_NAME
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_AMPERSAND]    = new Transition_VARIABLE_NAME_AMPERSAND();
        state_transition[I_OTHER]        = new Transition_VARIABLE_NAME_OTHER();
        state_transition[I_DEFAULT]      = new Transition_VARIABLE_NAME_DEFAULT();
        _transition[S_VARIABLE_NAME] = state_transition;

        // S_QUOTED_1
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_SINGLE_QUOTE] = new Transition_QUOTED_1_QUOTE_1();
        state_transition[I_EOL]          = new Transition_QUOTED_1_EOL();
        state_transition[I_DEFAULT]      = new Transition_QUOTED_1_DEFAULT();
        _transition[S_QUOTED_1] = state_transition;

        // S_QUOTED_2
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DOUBLE_QUOTE] = new Transition_QUOTED_2_QUOTE_2();
        state_transition[I_EOL]          = new Transition_QUOTED_2_EOL();
        state_transition[I_DEFAULT]      = new Transition_QUOTED_2_DEFAULT();
        _transition[S_QUOTED_2] = state_transition;

        // S_QUOTE_1_DONE
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_AMPERSAND]    = new Transition_QUOTE_1_DONE_AMPERSAND();
        state_transition[I_DEFAULT]      = new Transition_QUOTE_1_DONE_DEFAULT();
        _transition[S_QUOTE_1_DONE] = state_transition;

        // S_QUOTE_2_DONE
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_AMPERSAND]    = new Transition_QUOTE_2_DONE_AMPERSAND();
        state_transition[I_DEFAULT]      = new Transition_QUOTE_2_DONE_DEFAULT();
        _transition[S_QUOTE_2_DONE] = state_transition;

        // S_ESCAPED
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_ESCAPED_DEFAULT();
        _transition[S_ESCAPED] = state_transition;

        // S_BACKGROUND
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_BACKGROUND_DEFAULT();
        _transition[S_BACKGROUND] = state_transition;

        // S_BANG
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_BANG]         = new Transition_BANG_BANG();
        state_transition[I_OTHER]        = new Transition_BANG_OTHER();
        state_transition[I_DEFAULT]      = new Transition_BANG_DEFAULT();
        _transition[S_BANG] = state_transition;

        // S_LAST_COMMAND
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_LAST_COMMAND_DEFAULT();
        _transition[S_LAST_COMMAND] = state_transition;

        // S_EARLIER_COMMAND
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_OTHER]        = new Transition_EARLIER_COMMAND_OTHER();
        state_transition[I_DEFAULT]      = new Transition_EARLIER_COMMAND_DEFAULT();
        _transition[S_EARLIER_COMMAND] = state_transition;

        // S_DONE
        state_transition = new Transition[N_INPUT_CLASSES];
        state_transition[I_DEFAULT]      = new Transition_DONE_DEFAULT();
        _transition[S_DONE] = state_transition;
    }

    private void error()
    {
        throw new JShellException("Invalid token in command line");
    }

    private String state_name(int state)
    {
        String name;
        switch (state)
        {
            case S_PIPE:
                name = "S_PIPE";
                break;

            case S_REDIRECT_IN:
                name = "S_REDIRECT_IN";
                break;

            case S_REDIRECT_OUT:
                name = "S_REDIRECT_OUT";
                break;

            case S_APPEND:
                name = "S_APPEND";
                break;
                
            case S_SEPARATOR:
                name = "S_SEPARATOR";
                break;
                
            case S_VARIABLE:
                name = "S_VARIABLE";
                break;
                
            case S_QUOTE_1:
                name = "S_QUOTE_1";
                break;
                
            case S_QUOTE_2:
                name = "S_QUOTE_2";
                break;
                
            case S_STRING:
                name = "S_STRING";
                break;
                
            case S_UNKNOWN:
                name = "S_UNKNOWN";
                break;
                
            case S_DONE:
                name = "S_DONE";
                break;
                
            case S_VARIABLE_NAME:
                name = "S_VARIABLE_NAME";
                break;
                
            case S_QUOTED_1:
                name = "S_QUOTED_1";
                break;
                
            case S_QUOTED_2:
                name = "S_QUOTED_2";
                break;

            case S_QUOTE_1_DONE:
                name = "S_QUOTE_1_DONE";
                break;
                
            case S_QUOTE_2_DONE:
                name = "S_QUOTE_2_DONE";
                break;
                
            case S_ESCAPED:
                name = "S_ESCAPED";
                break;
                
            case S_BACKGROUND:
                name = "S_BACKGROUND";
                break;
                
            case S_BANG:
                name = "S_BANG";
                break;
                
            case S_LAST_COMMAND:
                name = "S_LAST_COMMAND";
                break;
                
            case S_EARLIER_COMMAND:
                name = "S_EARLIER_COMMAND";
                break;
                
            default:
                name = "Unrecognized state: "+state;
                break;
        }
        return name;
    }

    private String char_classification_name(int classification)
    {
        String name;
        switch (classification)
        {
            case I_DEFAULT:
                name = "I_DEFAULT";
                break;

            case I_WHITESPACE:
                name = "I_WHITESPACE";
                break;

            case I_END_OF_INPUT:
                name = "I_END_OF_INPUT";
                break;

            case I_HAT:
                name = "I_HAT";
                break;

            case I_LT:
                name = "I_LT";
                break;

            case I_GT:
                name = "I_GT";
                break;

            case I_SEMI:
                name = "I_SEMI";
                break;

            case I_DOLLAR:
                name = "I_DOLLAR";
                break;

            case I_SINGLE_QUOTE:
                name = "I_SINGLE_QUOTE";
                break;

            case I_DOUBLE_QUOTE:
                name = "I_DOUBLE_QUOTE";
                break;

            case I_ESCAPE:
                name = "I_ESCAPE";
                break;

            case I_AMPERSAND:
                name = "I_AMPERSAND";
                break;

            case I_BANG:
                name = "I_BANG";
                break;

            case I_OTHER:
                name = "I_OTHER";
                break;

            case I_EOL:
                name = "I_EOL";
                break;

            default:
                name = "Unrecognized char classification: "+classification;
                break;
        }
        return name;
    }
        

    private static final boolean TRACE = false;

    // States
    private static final int S_PIPE            = 0;   // ^
    private static final int S_REDIRECT_IN     = 1;   // <
    private static final int S_REDIRECT_OUT    = 2;   // >
    private static final int S_APPEND          = 3;   // >>
    private static final int S_SEPARATOR       = 4;   // ;
    private static final int S_VARIABLE        = 5;   // $
    private static final int S_QUOTE_1         = 6;   // '
    private static final int S_QUOTE_2         = 7;   // "
    private static final int S_STRING          = 8;   // simple_string,
    private static final int S_LAST_COMMAND    = 9;   // !!
    private static final int S_EARLIER_COMMAND = 10;  // !419
    private static final int S_UNKNOWN         = 11;
    private static final int S_DONE            = 12;
    private static final int S_VARIABLE_NAME   = 13;  // var_name following $
    private static final int S_QUOTED_1        = 14;  // Stuff in '...' 
    private static final int S_QUOTED_2        = 15;  // Stuff in "..."
    private static final int S_QUOTE_1_DONE    = 16;
    private static final int S_QUOTE_2_DONE    = 17;
    private static final int S_ESCAPED         = 18;
    private static final int S_BACKGROUND      = 19;
    private static final int S_BANG            = 20;
    private static final int N_STATES          = 21;

    // Input classifications
    private static final int I_DEFAULT         = 0;
    private static final int I_WHITESPACE      = 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -