亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bnf.java

?? 非常棒的java數據庫
?? JAVA
字號:
/*
 * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
 * (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.bnf;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import java.util.StringTokenizer;

import org.h2.server.web.DbContextRule;
import org.h2.tools.Csv;
import org.h2.util.Resources;
import org.h2.util.StringCache;
import org.h2.util.StringUtils;

/**
 * This class can read a file that is similar to BNF (Backus-Naur form).
 * It is made specially to support SQL grammar.
 */
public class Bnf {

    static final boolean COMBINE_KEYWORDS = false;

    private static final String SEPARATORS = " [](){}|.,\r\n<>:-+*/=<\">!'";
    private static final long MAX_PARSE_TIME = 100;

    private final Random random = new Random();
    private final HashMap ruleMap = new HashMap();
    private String syntax;
    private String currentToken;
    private String[] tokens;
    private char firstChar;
    private int index;
    private Rule lastRepeat;
    private ArrayList statements;
    private String currentTopic;

    /**
     * Create an instance using the grammar specified in the CSV file.
     *
     * @param csv if not specified, the help.csv is used
     * @return a new instance
     */
    public static Bnf getInstance(Reader csv) throws Exception {
        Bnf bnf = new Bnf();
        if (csv == null) {
            byte[] data = Resources.get("/org/h2/res/help.csv");
            csv = new InputStreamReader(new ByteArrayInputStream(data));
        }
        bnf.parse(csv);
        return bnf;
    }

    Bnf() {
        random.setSeed(1);
    }

    void addFixedRule(String name, int fixedType) {
        Rule rule = new RuleFixed(fixedType);
        addRule(name, "Fixed", rule);
    }

    RuleHead addRule(String topic, String section, Rule rule) {
        RuleHead head = new RuleHead(section, topic, rule);
        if (ruleMap.get(StringUtils.toLowerEnglish(topic)) != null) {
            throw new Error("already exists: " + topic);
        }
        ruleMap.put(StringUtils.toLowerEnglish(topic), head);
        return head;
    }

    public Random getRandom() {
        return random;
    }

    private void parse(Reader csv) throws Exception {
        csv = new BufferedReader(csv);
        Rule functions = null;
        statements = new ArrayList();
        ResultSet rs = Csv.getInstance().read(csv, null);
        for (int id = 0; rs.next(); id++) {
            String section = rs.getString("SECTION").trim();
            if (section.startsWith("System")) {
                continue;
            }
            String topic = StringUtils.toLowerEnglish(rs.getString("TOPIC").trim());
            topic = StringUtils.replaceAll(topic, " ", "");
            topic = StringUtils.replaceAll(topic, "_", "");
            syntax = rs.getString("SYNTAX").trim();
            currentTopic = section;
            if (section.startsWith("Function")) {
                int end = syntax.indexOf(':');
                syntax = syntax.substring(0, end);
            }
            tokens = tokenize();
            index = 0;
            Rule rule = parseRule();
            if (section.startsWith("Command")) {
                rule = new RuleList(rule, new RuleElement(";\n\n", currentTopic), false);
            }
            RuleHead head = addRule(topic, section, rule);
            if (section.startsWith("Function")) {
                if (functions == null) {
                    functions = rule;
                } else {
                    functions = new RuleList(rule, functions, true);
                }
            } else if (section.startsWith("Commands")) {
                statements.add(head);
            }
        }
        addRule("@func@", "Function", functions);
        addFixedRule("@ymd@", RuleFixed.YMD);
        addFixedRule("@hms@", RuleFixed.HMS);
        addFixedRule("@nanos@", RuleFixed.NANOS);
        addFixedRule("anythingExceptSingleQuote", RuleFixed.ANY_EXCEPT_SINGLE_QUOTE);
        addFixedRule("anythingExceptDoubleQuote", RuleFixed.ANY_EXCEPT_DOUBLE_QUOTE);
        addFixedRule("anythingUntilEndOfLine", RuleFixed.ANY_UNTIL_EOL);
        addFixedRule("anythingUntilEndComment", RuleFixed.ANY_UNTIL_END);
        addFixedRule("anything", RuleFixed.ANY_WORD);
        addFixedRule("@hexStart@", RuleFixed.HEX_START);
        addFixedRule("@concat@", RuleFixed.CONCAT);
        addFixedRule("@az_@", RuleFixed.AZ_UNDERLINE);
        addFixedRule("@af@", RuleFixed.AF);
        addFixedRule("@digit@", RuleFixed.DIGIT);
    }

    /**
     * Get the HTML documentation for a given syntax.
     * 
     * @param rule the rule (topic)
     * @param syntax the BNF syntax
     * @return the HTML formatted text
     */
    public String getSyntaxHtml(String rule, String syntax) {
        StringTokenizer tokenizer = new StringTokenizer(syntax, SEPARATORS, true);
        StringBuffer buff = new StringBuffer();
        while (tokenizer.hasMoreTokens()) {
            String s = tokenizer.nextToken();
            if (s.length() == 1 || StringUtils.toUpperEnglish(s).equals(s)) {
                buff.append(s);
                continue;
            }
            RuleHead found = null;
            for (int i = 0; i < s.length(); i++) {
                String test = StringUtils.toLowerEnglish(s.substring(i));
                RuleHead r = (RuleHead) ruleMap.get(test);
                if (r != null) {
                    found = r;
                    break;
                }
            }
            if (found == null || found.rule instanceof RuleFixed) {
                buff.append(s);
                continue;
            }
            String page = "grammar.html";
            if (found.section.startsWith("Data Types")) {
                page = "datatypes.html";
            } else if (found.section.startsWith("Functions")) {
                page = "functions.html";
            }
            String link = StringUtils.urlEncode(found.getTopic().toLowerCase());
            buff.append("<a href=\""+page+"#"+link+"\">");
            buff.append(s);
            buff.append("</a>");
        }
        return buff.toString();
    }

    private Rule parseRule() {
        read();
        return parseOr();
    }

    private Rule parseOr() {
        Rule r = parseList();
        if (firstChar == '|') {
            read();
            r = new RuleList(r, parseOr(), true);
        }
        lastRepeat = r;
        return r;
    }

    private Rule parseList() {
        Rule r = parseToken();
        if (firstChar != '|' && firstChar != ']' && firstChar != '}' && firstChar != 0) {
            r = new RuleList(r, parseList(), false);
        }
        lastRepeat = r;
        return r;
    }

    private Rule parseToken() {
        Rule r;
        if ((firstChar >= 'A' && firstChar <= 'Z') || (firstChar >= 'a' && firstChar <= 'z')) {
            // r = new RuleElement(currentToken+ " syntax:" + syntax);
            r = new RuleElement(currentToken, currentTopic);
        } else if (firstChar == '[') {
            read();
            Rule r2 = parseOr();
            boolean repeat = false;
            if (r2.last() instanceof RuleRepeat) {
                repeat = true;
            }
            r = new RuleOptional(r2, repeat);
            if (firstChar != ']') {
                throw new Error("expected ], got " + currentToken + " syntax:" + syntax);
            }
        } else if (firstChar == '{') {
            read();
            r = parseOr();
            if (firstChar != '}') {
                throw new Error("expected }, got " + currentToken + " syntax:" + syntax);
            }
        } else if ("@commaDots@".equals(currentToken)) {
            r = new RuleList(new RuleElement(",", currentTopic), lastRepeat, false);
            r = new RuleRepeat(r);
        } else if ("@dots@".equals(currentToken)) {
            r = new RuleRepeat(lastRepeat);
        } else {
            r = new RuleElement(currentToken, currentTopic);
        }
        lastRepeat = r;
        read();
        return r;
    }

    private void read() {
        if (index < tokens.length) {
            currentToken = tokens[index++];
            firstChar = currentToken.charAt(0);
        } else {
            currentToken = "";
            firstChar = 0;
        }
    }

    private String[] tokenize() {
        ArrayList list = new ArrayList();
        syntax = StringUtils.replaceAll(syntax, "yyyy-MM-dd", "@ymd@");
        syntax = StringUtils.replaceAll(syntax, "hh:mm:ss", "@hms@");
        syntax = StringUtils.replaceAll(syntax, "nnnnnnnnn", "@nanos@");
        syntax = StringUtils.replaceAll(syntax, "function", "@func@");
        syntax = StringUtils.replaceAll(syntax, "0x", "@hexStart@");
        syntax = StringUtils.replaceAll(syntax, ",...", "@commaDots@");
        syntax = StringUtils.replaceAll(syntax, "...", "@dots@");
        syntax = StringUtils.replaceAll(syntax, "||", "@concat@");
        syntax = StringUtils.replaceAll(syntax, "a-z|_", "@az_@");
        syntax = StringUtils.replaceAll(syntax, "A-Z|_", "@az_@");
        syntax = StringUtils.replaceAll(syntax, "a-f", "@af@");
        syntax = StringUtils.replaceAll(syntax, "A-F", "@af@");
        syntax = StringUtils.replaceAll(syntax, "0-9", "@digit@");
        StringTokenizer tokenizer = new StringTokenizer(syntax, SEPARATORS, true);
        while (tokenizer.hasMoreTokens()) {
            String s = tokenizer.nextToken();
            // avoid duplicate strings
            s = StringCache.get(s);
            if (s.length() == 1) {
                if (" \r\n".indexOf(s.charAt(0)) >= 0) {
                    continue;
                }
            }
            list.add(s);
        }
        return (String[]) list.toArray(new String[0]);
    }

    /**
     * Get the list of tokens that can follow.
     * This is the main autocomplete method.
     * The returned map for the query 'S' may look like this:
     * <pre>
     * key: 1#SELECT, value: ELECT
     * key: 1#SET, value: ET
     * </pre>
     * 
     * @param query the start of the statement
     * @return the map of possible token types / tokens
     */
    public HashMap getNextTokenList(String query) {
        HashMap next = new HashMap();
        Sentence sentence = new Sentence();
        sentence.next = next;
        sentence.text = query;
        for (int i = 0; i < statements.size(); i++) {
            RuleHead head = (RuleHead) statements.get(i);
            if (!head.section.startsWith("Commands")) {
                continue;
            }
            sentence.max = System.currentTimeMillis() + MAX_PARSE_TIME;
            head.getRule().addNextTokenList(query, sentence);
        }
        return next;
    }

    /**
     * Cross-link all statements with each other.
     * This method is called after updating the topics.
     */
    public void linkStatements() {
        for (Iterator it = ruleMap.values().iterator(); it.hasNext();) {
            RuleHead r = (RuleHead) it.next();
            r.getRule().setLinks(ruleMap);
        }
    }

    /**
     * Update a topic with a context specific rule.
     * This is used for autocomplete support.
     * 
     * @param topic the topic
     * @param rule the database context rule
     */
    public void updateTopic(String topic, DbContextRule rule) {
        topic = StringUtils.toLowerEnglish(topic);
        RuleHead head = (RuleHead) ruleMap.get(topic);
        if (head == null) {
            head = new RuleHead("db", topic, rule);
            ruleMap.put(topic, head);
            statements.add(head);
        } else {
            head.rule = rule;
        }
    }

    /**
     * Get the list of possible statements.
     * 
     * @return the list of statements
     */
    public ArrayList getStatements() {
        return statements;
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美韩国日本不卡| 欧美一级欧美三级在线观看| 激情综合色播激情啊| 亚洲观看高清完整版在线观看 | 亚洲欧美国产高清| 国产精品卡一卡二| 国产精品国产三级国产| ㊣最新国产の精品bt伙计久久| 久久无码av三级| 国产人伦精品一区二区| 国产精品视频一二三| 中文字幕亚洲一区二区va在线| 中文字幕在线观看一区| 亚洲天堂a在线| 亚洲一区二区三区国产| 日韩精品久久理论片| 麻豆精品视频在线观看免费| 精品一区二区av| av在线综合网| 欧美午夜精品免费| 91麻豆精品国产自产在线观看一区 | 日韩精品中文字幕一区| 欧美一级片在线观看| 精品久久久久香蕉网| 国产丝袜在线精品| 亚洲视频一二区| 亚洲成a天堂v人片| 国产美女精品一区二区三区| 大桥未久av一区二区三区中文| 色伊人久久综合中文字幕| 欧美精品一二三区| 久久综合九色综合97_久久久| 国产精品久久久久影院色老大 | 精品久久久三级丝袜| 中文字幕一区二区不卡| 午夜欧美视频在线观看| 国产精品影视天天线| 在线观看av一区| 精品久久久久久最新网址| 亚洲免费在线视频一区 二区| 免费人成精品欧美精品| 91在线精品一区二区三区| 日韩午夜在线观看视频| 樱桃视频在线观看一区| 韩国视频一区二区| 欧美日韩成人在线一区| 中文字幕在线观看不卡视频| 日韩激情中文字幕| 日本大香伊一区二区三区| 久久久综合九色合综国产精品| 亚洲一区中文在线| 风间由美一区二区三区在线观看 | 久久99深爱久久99精品| 91视视频在线直接观看在线看网页在线看| 欧美老女人在线| 亚洲蜜臀av乱码久久精品| 国产尤物一区二区| 日韩欧美国产精品一区| 一区二区三区四区在线| 99久久国产综合精品麻豆| 久久久久久免费网| 老司机精品视频一区二区三区| 欧美日韩国产免费一区二区| 国产精品毛片高清在线完整版| 国产一区二区美女诱惑| 日韩午夜在线观看视频| 男人操女人的视频在线观看欧美 | 日韩视频免费观看高清在线视频| 亚洲色图在线视频| av一区二区三区四区| 久久久91精品国产一区二区三区| 日韩av电影天堂| 666欧美在线视频| 午夜视频一区二区| 欧美日韩国产不卡| 亚洲成人在线观看视频| 欧美色中文字幕| 亚洲香肠在线观看| 欧美三级一区二区| 视频在线观看一区二区三区| 欧美日韩一区在线观看| 亚洲成av人片在线观看| 欧美日韩亚洲综合一区二区三区| 午夜欧美2019年伦理 | 美女久久久精品| 日韩精品中文字幕一区| 国产一区二区91| 国产欧美日韩三区| av在线播放一区二区三区| 一区二区三区日韩欧美| 精品婷婷伊人一区三区三| 日韩成人免费电影| 国产情人综合久久777777| 成人免费黄色大片| 亚洲精品成人天堂一二三| 欧美视频日韩视频| 精品一区二区三区视频在线观看 | 91啦中文在线观看| 亚洲成人av中文| 日韩视频一区二区在线观看| 国产成人在线看| 一区二区三区蜜桃网| 日韩午夜在线影院| eeuss鲁片一区二区三区在线看 | 欧美剧情片在线观看| 免费精品视频最新在线| 久久视频一区二区| 色欧美88888久久久久久影院| 日精品一区二区三区| 国产午夜精品在线观看| 在线精品视频免费播放| 国内精品伊人久久久久av一坑| 国产精品久久久久永久免费观看| 欧美吻胸吃奶大尺度电影 | 亚洲色图视频免费播放| 欧美精品久久久久久久多人混战| 久久精品国产免费看久久精品| 国产精品美女一区二区在线观看| 欧美在线色视频| 国产精品一二二区| 日韩**一区毛片| 中文字幕视频一区二区三区久| 91精品在线观看入口| 成人av免费在线播放| 久久av中文字幕片| 亚洲成av人在线观看| 亚洲欧洲日韩av| 久久精品网站免费观看| 欧美精品久久一区| 一本一道综合狠狠老| 大尺度一区二区| 精品一区二区日韩| 欧美a一区二区| 日韩激情在线观看| 亚洲一区在线看| 一区二区三区四区在线播放| 国产精品―色哟哟| 久久久青草青青国产亚洲免观| 欧美日韩国产综合久久 | 日本成人在线电影网| 亚洲天堂久久久久久久| 国产精品视频一二三区| 久久久99精品久久| 久久久夜色精品亚洲| 日韩一区二区视频在线观看| 欧美日韩国产区一| 欧美精品九九99久久| 在线免费观看日韩欧美| 色av综合在线| 日本精品一区二区三区高清| 91在线高清观看| 一本久道中文字幕精品亚洲嫩| 91无套直看片红桃| 91美女片黄在线观看91美女| 91亚洲精品一区二区乱码| av成人免费在线| 97精品国产露脸对白| 色婷婷久久久久swag精品| 欧美在线短视频| 欧美性做爰猛烈叫床潮| 欧美日韩精品免费| 日韩欧美视频一区| 久久这里都是精品| 国产精品视频一二| 一区二区三区国产精华| 一区二区日韩av| 免费久久99精品国产| 国产精品一区二区不卡| av不卡在线播放| 91传媒视频在线播放| 日韩一区二区精品葵司在线| 久久精品夜色噜噜亚洲a∨| 久久久精品免费网站| 国产精品久久久久久久久图文区| 亚洲欧美日韩在线| 水蜜桃久久夜色精品一区的特点 | 国产精品视频看| 一区二区三区.www| 美女网站在线免费欧美精品| 国产精品99久久久| 一本大道av伊人久久综合| 9191精品国产综合久久久久久| 日韩女优av电影| 国产精品久线在线观看| 日韩精品亚洲专区| 国产精品99久久久久久久女警 | 成人黄色网址在线观看| 91久久国产最好的精华液| 日韩午夜在线观看| 亚洲人成网站色在线观看| 日韩电影免费一区| gogo大胆日本视频一区| 日韩一区和二区| 亚洲综合激情另类小说区| 国产精品亚洲专一区二区三区| 91理论电影在线观看| 久久久亚洲国产美女国产盗摄| 亚洲精品视频自拍| 国产剧情一区在线| 欧美日免费三级在线|