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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? main.cpp

?? Code for top down parser in C++
?? CPP
字號:
//---------------------------------------------------------------------------
//
//  Top-down parser with backtracking for arbitrary context-free grammars
//  Dmitry Brant, Spr 2004
//
//-----------

#include <vcl.h>
#pragma hdrstop

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <stdexcept.h>
#include "grammar.h"
#include "treeform.h"

using std::runtime_error;

bool Traverse(char* input);
unsigned int inputLength, verbosity=0;
Grammar* g;
//---------------------------------------------------------------------------


int main(int argc, char* argv[]){

    g = new Grammar();
    char* inputStr = new char[32768]; //nice, big buffer for input
    char* grammarFile = "grammar.txt";
    memset(inputStr, 0, 32768);
    inputStr[0] = 0;

    try{
        bool doEliminateEpsilon=true, doEliminateUnit=true, doEliminateLeftRecursion=true;

        //what's this? do we have a command line argument?
        if(argc > 1){
            for(int i=1; i<argc; i++){
                if(LowerCase(String(argv[i])) == "-v"){
                    if(i<(argc-1)){ verbosity = atoi(argv[i+1]); i++; }
                }
                else if(LowerCase(String(argv[i])) == "-g"){
                    if(i<(argc-1)){ grammarFile = argv[i+1]; i++; }
                }
                else if(LowerCase(String(argv[i])) == "-ne"){
                    doEliminateEpsilon = false;
                }
                else if(LowerCase(String(argv[i])) == "-nu"){
                    doEliminateUnit = false;
                }
                else if(LowerCase(String(argv[i])) == "-nr"){
                    doEliminateLeftRecursion = false;
                }
                else if(LowerCase(String(argv[i])) == "-na"){
                    doEliminateEpsilon = false;
                    doEliminateUnit = false;
                    doEliminateLeftRecursion = false;
                }
                else{
                    FILE* f = fopen(argv[i], "rb");
                    if(!f) throw runtime_error(("could not open " + String(argv[1]) + " for input").c_str());
                    unsigned int bytesread = fread(inputStr, 1, 32768, f);
                    fclose(f);
                    if(!bytesread) throw runtime_error(("could not read from file " + String(argv[1])).c_str());
                    inputLength = bytesread;
                    printf("Input loaded successfully.\n");
                }
            }
        }

        g->LoadFromFile(grammarFile);
        printf("\nGrammar loaded successfully.\n");

        if(doEliminateEpsilon){
            g->EliminateEpsilonProductions();
            g->SaveToFile("grammar_after_epsilon.txt");
            printf("Epsilon productions eliminated.\n");
        }

        if(doEliminateUnit){
            g->EliminateUnitProductions();
            g->SaveToFile("grammar_after_unit.txt");
            printf("Unit productions eliminated.\n");
        }

        if(doEliminateLeftRecursion){
            g->EliminateLeftRecursion();
            g->SaveToFile("grammar_after_left_recursion.txt");
            printf("Left recursion eliminated.\n");
        }
        
        if(!inputStr[0]){
            printf("\nPlease enter your input string:\n");
            gets(inputStr);
            inputLength = strlen(inputStr);
        }

        if(!inputLength) throw runtime_error("Empty input string");

        //collapse whitespace in string
        int ptr=0, newPtr=0;
        do{
            if((inputStr[ptr] > ' ') || (inputStr[ptr] == 0)){
                inputStr[newPtr++] = inputStr[ptr];
            }
        }while(inputStr[ptr++] != 0);

        //check this out:
        if(Traverse(inputStr)){
            printf("\nString parsed successfully!\n");
        }else{
            throw runtime_error("failed to parse string");
        }

    }catch(exception &e){
        printf("\nParsing failed: %s\n", e.what());
    }catch(...){
        printf("\nUnknown exception.\n");
    }

    delete g;
    delete [] inputStr;
    return 0;
}
//---------------------------------------------------------------------------



void printNodes(TList* nodes, ParseNode* currentNode){
    for(int i=0; i<nodes->Count; i++){
        if(((ParseNode*)nodes->Items[i]) == currentNode){
            printf("[");
            printf(((ParseNode*)nodes->Items[i])->str.c_str());
            printf("]");
        }else
        printf(((ParseNode*)nodes->Items[i])->str.c_str());
        int idx = ((ParseNode*)nodes->Items[i])->index;
        printf(("<" + String(idx) + ">").c_str());
    }
    printf("\n");
}
//---------------------------------------------------------------------------

void printflevel(int level, char* str){
    for(int i=0; i<level; i++) printf("  ");
    printf(str);
}
//---------------------------------------------------------------------------

void DeleteNodeChildren(TList* nodes, ParseNode* node){
    //delete any other nodes whose parent is this node
    for(int i=0; i<nodes->Count; i++){
        ParseNode* otherNode = (ParseNode*)nodes->Items[i];
        if(otherNode->parent == node){
            if(!otherNode->terminal) DeleteNodeChildren(nodes, otherNode);
            int pos = nodes->IndexOf(otherNode);
            delete otherNode;
            nodes->Delete(pos);
            i--;
        }
    }
}
//-----------------------------------------

bool MatchNodeTrace(TList* nodes, char* input){
    int inputPtr=0;
    bool equal = true;
    //delete any other nodes whose parent is this node
    for(int i=0; i<nodes->Count; i++){
        ParseNode* node = (ParseNode*)nodes->Items[i];
        if(node->terminal && (node->str != "")){
            if(node->str != String(input[inputPtr])){
                equal = false; break;
            }
            inputPtr++;
        }
    }
    return equal;
}
//-----------------------------------------



//The traversal procedure:
//an ingenious linked-list design, without recursion.
//Algorithm:
//Wave hands, and sing:
//   "Backtrack, backtrack, search, search, search,
//      "Search, search, search, and backtrack some more!"

bool Traverse(char* input){

    RewriteRuleGroup* activeGroup;
    if(!g->ruleGroups->Count) throw runtime_error("empty grammar");
    activeGroup = (RewriteRuleGroup*)g->ruleGroups->Items[0];
    if(verbosity > 0) printf(("\nAssuming start symbol " + activeGroup->nonTerminal + "\n").c_str());

    //create parse node list
    TList* nodes = new TList();
    try{
        //set up first node
        ParseNode* node = new ParseNode();
        nodes->Add(node);
        node->myGroup = activeGroup;
        node->terminal = false;
        node->currentRuleIndex = 0;
        node->str = activeGroup->nonTerminal;

        int currentNodeIndex = 0;
        int inputPtr = 0;
        bool match;

        while(1){

            //find the next unmarked node
            node = NULL;
            for(int i=0; i<nodes->Count; i++){
                ParseNode* newNode = (ParseNode*)nodes->Items[i];
                if(newNode->index == -1){ node = newNode; break; }
            }
            if(!node){
                //are we at the end of the string? [I hope?]
                if(input[inputPtr] == 0){

                    //there's still a small chance that the terminal trace of the nodes
                    //does not match output
                    if(!MatchNodeTrace(nodes, input)){
                        goto backtrack;
                    }

                    //we're done!!!
                    if(verbosity > 0) printf("Success!\n");
                    //show the parse tree
                    TfrmTree* theForm = new TfrmTree(NULL);
                    theForm->FillTree(nodes, (ParseNode*)nodes->Items[0], NULL);
                    theForm->TreeView1->FullExpand();
                    theForm->ShowModal();
                    delete theForm;
                    return true;

                }else{

                    //This condition occurs when the algorithm is "successful"
                    //all the way back to the start symbol, and yet there's still
                    //input remaining. This means only one thing:

                    //Backtrack!!!!!!
                    //My apologies, Father Dijkstra:
                    goto backtrack;

                }
            }

            if(!node->terminal){
                //if the node is a nonterminal, roll it out
                if(verbosity > 1) printflevel(node->level, ("Encountered nonterminal " + node->str + "\n").c_str());
                RewriteRule* currentRule = (RewriteRule*)node->myGroup->rules->Items[node->currentRuleIndex];

                if(verbosity > 1){ printflevel(node->level, ""); printNodes(nodes, node); }

                //this rule can only be used once. increment the rule used index
                node->currentRuleIndex++;

                if(verbosity > 0) printflevel(node->level, ("Rolling out nonterminal " + node->str + " -> ").c_str());

                //start inserting nodes directly after the current node index
                int insertPoint=currentNodeIndex+1;
                for(int i=0; i<currentRule->units->Count; i++){
                    RewriteUnit* unit = (RewriteUnit*)currentRule->units->Items[i];
                    ParseNode* newNode = new ParseNode();
                    newNode->index = -1;
                    newNode->parent = node;
                    newNode->level = node->level+1;
                    nodes->Insert(insertPoint++, newNode);
                    newNode->terminal = unit->terminal;
                    newNode->str = unit->str;
                    if(!newNode->terminal){
                        //find the group of this nonterminal
                        newNode->myGroup = g->getGroup(newNode->str);
                        newNode->currentRuleIndex = 0;
                    }
                    if(verbosity > 0){ if(newNode->str=="") printf("

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲电影激情视频网站| 成人一道本在线| 91国产成人在线| 正在播放一区二区| 亚洲国产日产av| 91原创在线视频| 亚洲国产成人午夜在线一区| 国产在线看一区| 久久亚洲一区二区三区明星换脸| 美女脱光内衣内裤视频久久影院| 91在线丨porny丨国产| 国产精品美女久久久久久久久久久| 国产呦萝稀缺另类资源| 久久这里都是精品| 久久 天天综合| 国产欧美一区二区精品婷婷| 日韩福利电影在线| 国产 日韩 欧美大片| 亚洲天堂成人在线观看| 欧美三级电影一区| 韩国一区二区三区| 国产精品二三区| 欧美日韩国产乱码电影| 国产精品69毛片高清亚洲| 亚洲欧美日韩精品久久久久| 欧美精品 国产精品| 国产成人亚洲综合a∨猫咪| 成人欧美一区二区三区白人| 欧美日韩精品一区视频| 高清国产一区二区三区| 亚洲国产精品久久久久婷婷884| 日韩视频在线观看一区二区| 99精品一区二区三区| 久久精品国产在热久久| 亚洲欧洲精品成人久久奇米网| 欧美军同video69gay| 国产精品一区久久久久| 午夜视频一区二区| 成人欧美一区二区三区黑人麻豆| 91精品国产综合久久精品app | 国产麻豆精品久久一二三| 国产精品色在线| 日韩欧美中文一区| 91福利小视频| 粉嫩av亚洲一区二区图片| 日日嗨av一区二区三区四区| 久久久国产一区二区三区四区小说 | 国产三级精品三级| 欧美日韩专区在线| 99热精品一区二区| 国产又粗又猛又爽又黄91精品| 午夜久久福利影院| 亚洲丝袜另类动漫二区| 久久九九久久九九| 日韩一区二区精品葵司在线| 欧美日韩中文字幕一区| 9色porny自拍视频一区二区| 激情久久五月天| 青青草97国产精品免费观看无弹窗版 | 99精品久久99久久久久| 久久99九九99精品| 日韩中文字幕区一区有砖一区 | 欧美午夜不卡在线观看免费| 正在播放亚洲一区| 欧美伦理电影网| 在线视频欧美精品| 色综合天天在线| 99久久99久久精品免费看蜜桃| 国产xxx精品视频大全| 国产真实乱子伦精品视频| 免费在线欧美视频| 日本欧美加勒比视频| 亚洲国产精品久久一线不卡| 亚洲理论在线观看| 亚洲精品一二三区| 亚洲精品菠萝久久久久久久| 亚洲男女一区二区三区| 亚洲六月丁香色婷婷综合久久| 中文字幕一区在线观看视频| 亚洲国产高清在线观看视频| 欧美国产日本韩| 国产精品久久三| 日韩美女视频一区二区| 亚洲色欲色欲www| 一区二区理论电影在线观看| 伊人婷婷欧美激情| 亚洲愉拍自拍另类高清精品| 亚洲午夜激情av| 亚洲天堂网中文字| 亚洲日本在线a| 一区二区三区免费| 香港成人在线视频| 青青草97国产精品免费观看无弹窗版| 日本美女一区二区| 韩国一区二区在线观看| 国产精品亚洲一区二区三区在线 | 麻豆久久久久久| 奇米影视一区二区三区小说| 激情丁香综合五月| 成人综合婷婷国产精品久久| 在线免费观看不卡av| 欧美日韩国产首页| 精品国产一区二区三区四区四| 久久久精品人体av艺术| 亚洲私人黄色宅男| 日本伊人午夜精品| 国产成人在线观看免费网站| 色婷婷国产精品综合在线观看| 欧美三日本三级三级在线播放| 欧美va亚洲va| 最新欧美精品一区二区三区| 日韩国产精品久久| 国产剧情一区二区| 色婷婷久久99综合精品jk白丝| 欧美精品在欧美一区二区少妇| 久久久久久久一区| 一区二区三区不卡视频| 久久国产婷婷国产香蕉| 成人激情动漫在线观看| 在线播放亚洲一区| 中文字幕中文字幕一区二区| 天天影视网天天综合色在线播放| 精品一区二区三区视频| 欧美综合视频在线观看| 久久伊人中文字幕| 亚洲线精品一区二区三区 | 国产欧美一区二区在线| 亚州成人在线电影| 成人av小说网| 欧美videos中文字幕| 亚洲综合激情网| 国产91精品一区二区| 日韩一卡二卡三卡四卡| 亚洲九九爱视频| 国产很黄免费观看久久| 欧美另类久久久品| 国产精品成人一区二区艾草| 奇米色一区二区| 欧美日精品一区视频| 亚洲婷婷综合色高清在线| 国产一区二区三区综合| 在线成人免费视频| 亚洲激情中文1区| 成人一区二区视频| 久久老女人爱爱| 日本不卡在线视频| 欧美日韩精品二区第二页| 亚洲欧美国产高清| 成人app网站| 国产亚洲女人久久久久毛片| 午夜婷婷国产麻豆精品| 在线观看三级视频欧美| 国产精品高清亚洲| 高清成人在线观看| 国产亚洲成aⅴ人片在线观看 | 午夜视频一区二区| 欧洲一区在线电影| 亚洲综合色区另类av| 波多野结衣一区二区三区| 国产日韩欧美a| 国产激情一区二区三区| 久久综合视频网| 激情文学综合丁香| 日韩欧美一级二级| 精品中文字幕一区二区| 91精品福利在线一区二区三区 | 成人在线综合网站| 日本一区二区在线不卡| 国产成人精品免费看| 激情小说欧美图片| 日韩午夜电影在线观看| 麻豆成人av在线| 精品福利在线导航| 国内精品写真在线观看| 久久婷婷久久一区二区三区| 国产一区二区美女诱惑| 久久午夜羞羞影院免费观看| 国产乱码一区二区三区| 国产精品三级av在线播放| 91麻豆自制传媒国产之光| 亚洲免费在线看| 51精品国自产在线| 久久99国产精品麻豆| 国产片一区二区三区| 99久久99久久精品国产片果冻| 一区二区在线观看av| 91麻豆精品国产91久久久使用方法 | 六月丁香婷婷久久| 久久久久国产精品麻豆| 成人毛片老司机大片| 亚洲精品中文在线| 91精品国产麻豆| 国产成a人无v码亚洲福利| 亚洲欧美一区二区三区国产精品| 欧美中文字幕亚洲一区二区va在线| 日一区二区三区| 国产欧美日韩在线视频| 一本色道综合亚洲| 久久精品国产第一区二区三区| 国产欧美日韩在线视频|