青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

用C++編寫簡單繪圖語言的語法分析器

語法分析器概述

從詞法分析的角度看,語言是一個單詞的集合,稱之為正規(guī)集,單詞是由一個個字符組成的線性結(jié)構(gòu);從語法分析的角度看,語言是一個句子的集合,而句子是由詞法分析器返回的記號組成的非線性結(jié)構(gòu)。反映句子結(jié)構(gòu)的最好方法是樹,常用的有分析樹和語法樹。分析語法結(jié)構(gòu)的基本方法有兩種:自上而下分析方法和自下而上分析方法。自上而下分析從根到葉子建立分析樹,而自下而上分析恰好相反。在這兩種情況下,分析器都是從左到右地掃描輸入,每次讀進一個記號。

         與詞法分析類似,語法分析也具有雙重含義:

         ①規(guī)定句子形成的規(guī)則,也被稱為語法規(guī)則。程序設計語言的大部分語法規(guī)則可以用上下文無關(guān)文法(Context Free Grammar,簡稱CFG)來描述。

         ②根據(jù)語法規(guī)則識別記號流中的評議結(jié)構(gòu),也被稱為語法分析。最有效的自上而下和自下而上的分析方法都只能處理上下文無關(guān)文法的子類,如LL文法和LR方法,但是它們已足以應付程序設計評議的絕大多數(shù)語法現(xiàn)象。

一、任務與目的

·上機任務:

1、使用C/C++程序設計語言和遞歸下降子程序的方法編寫該函數(shù)繪圖語言的詞法分析器。并要求設計一個語法分析器的測試小程序來調(diào)用自己編寫的語法分析器測試各種不同的輸入。

2、語法分析的任務是在詞法分析基礎上,根據(jù)語言的語法規(guī)則,把詞法符號分解成各類語法單位。語法分析所依據(jù)的是語言的語法規(guī)則,語法規(guī)則通常用上下文無關(guān)文法描述。

·上機目的:

通過自己動手編寫語法分析器,掌握正規(guī)式與正規(guī)文法、上下文無關(guān)文法(CFG)、有推導的基本概念(推導、分析樹與語法樹、二義性及二義性的消除)、自上而下分析(遞歸下降子程序方法、預測分析表方法、LL1)文法)、自下而上分析。理解如何理論聯(lián)系實際以及明白理論與實際的差別。

二、分析與設計

語法分析程序一般具有如下功能: 對單詞符號串進行語法分析(根據(jù)語義規(guī)則進行推導和規(guī)約),識別出程序中的各類語法單位,最終判斷輸入串是否構(gòu)成語法上正確的程序。

這里我們采用遞歸下降分析方法:直接以程序的方式模擬產(chǎn)生式產(chǎn)生語言的過程。它的基本設計思想是:為每一個非終結(jié)符構(gòu)造一個子程序,每一個子程序的過程體中按該產(chǎn)生式的候選項分情況展開,遇到終結(jié)符直接匹配,而遇到非終結(jié)符就調(diào)用相應非終結(jié)符的子程序。該分析從調(diào)用文法開始符號的子程序開始,直到所有非終結(jié)符都展開為終結(jié)符并得到匹配為止。若分析過程中達到這一步則表明分析成功,否則表明輸入中有語法錯誤。遞歸下降分析對文法的限制是不能有公共左因子和左遞歸。由于文法是遞歸定義的,因此子程序也是遞歸的。

對于規(guī)模比較小的語言,遞歸下降子程序方法是很有效的方法,它簡單靈活,容易構(gòu)造,其缺點是程序與文法直接相關(guān),對文法的任何改變均需對程序進行相應的修改。

這里給出詞法分析程序大概的設計方法:

             1、根據(jù)要求寫出語法分析的上下文無關(guān)文法G

             2、消除上下文無關(guān)文法G的二義性;

             3、消除上下文無關(guān)文法G的(直接)左遞歸,并提取左因子;

             4、構(gòu)造文法的狀態(tài)轉(zhuǎn)換圖并且簡化;

             5、將轉(zhuǎn)換圖轉(zhuǎn)化為EBNF表示;

             6、從EBNF構(gòu)造遞歸下降子程序;

以下是較為詳細的設計:

①總體結(jié)構(gòu)與模塊劃分

語法測試模塊(parsermain.cpp)

語法分析器模塊(parser.h & parser.cpp)

繪圖語言解釋器入口

遞歸子程序集

先序遍歷并打印表達式的語法樹

出錯處理模塊

 

 

詞法分析器模塊(scanner.h & scanner.cpp)

 

初使化詞法分析器

識別出具有獨立意義的最小語法單位

輔助性模塊

②重要數(shù)據(jù)結(jié)構(gòu)

·語法樹節(jié)點類型

struct ExprNode {                                               // 語法樹節(jié)點類型

     enum Token_Type OpCode;

     union {

         struct {

              ExprNode *Left, *Right;

         } CaseOperator;

         struct {

              ExprNode *Child;

              FuncPtr MathFuncPtr;

         } CaseFunc;

         double CaseConst;

         double *CaseParmPtr;

     } Content;

};

③關(guān)鍵思想與算法

·改寫二義文法為非二義文法的方法:通過引入新的非終結(jié)符,使原來分辨不清的結(jié)構(gòu)受到約束,從而使得對任何一個句子,僅能構(gòu)造一棵分析樹。

·消除直接左遞歸算法

輸入:文法G中所有的A產(chǎn)生成

輸出:等價的不含直接左遞歸的文法G

方法:首先,整理A產(chǎn)生式為如下形式:

       AàAa1|Aa2||Aam|p1|p2||pn

            其中,ai非空,pj均不以A開始,然后用下述產(chǎn)生式代替A產(chǎn)生式:

        Aàp1A| p2A||pnA

       Aà a1A| a2A||amA|e

·消除左遞歸算法

輸入:無回路文法G

輸出:左遞歸的等價文法G

方法:將非終結(jié)符合理排序:A1,A2,An,然后運用下述過程:

for i in 2..n

loop for j in 1..i-1

loop AjàQ1|Q2|…|Qk的右部替換每個形如AiàAj產(chǎn)生式中的Aj,得到新產(chǎn)生式:

     AiàQ1r|Q2r|…|Qkr;

     消除Ai產(chǎn)生式中的直接左遞歸;

end loop;

end loop;

·提取文法左因子算法:

輸入:文法G

輸出:等價的無左因子文法G

方法:為每個產(chǎn)生式A,找出其候選項中最長公共前綴a,重排A產(chǎn)生式如下,其中r是不以a為前綴的其他候選項。

       Aàap1|ap2||apn|r

      并用下述產(chǎn)生式替代之。

       AàaA|r     Aàp1|p2||pn

      重復此過程,直到所有A產(chǎn)生式的候選項中均不再有公共前綴。

·構(gòu)造遞歸下降子程序的方法:

①構(gòu)造文法的狀態(tài)轉(zhuǎn)換圖并且簡化;

②將轉(zhuǎn)換圖轉(zhuǎn)化為EBNF表示;

③從EBNF構(gòu)造遞歸下降子程序;

三、測試例程設計

·測試程序(parsermain.cpp

#include <stdio.h>

#include "parser.h"

extern void Parser(char *SrcFilePtr);

int main(){

     Parser("test.txt");

     return 0;

}

·測試數(shù)據(jù)(test.txt

// test data

for t from -100 to 100 step 1 draw (t, 0);

四、測試結(jié)果及分析

·測試環(huán)境

    ·軟件平臺:

    OS 名稱               Microsoft Windows XP Professional

    OS版本                5.1.2600 Service Pack 2 內(nèi)部版本號 2600

    OS 制造商             Microsoft Corporation

    開發(fā)環(huán)境              Microsoft .NET Framework版本 3.5

                                  Microsoft Visual Studio 2008版本 9.0.21022.8 RTM

          Microsoft Visual C++ 2008版本91899-270-3541886-60490

    ·硬件平臺:

                 系統(tǒng)類型                   基于 X86 PC

                 處理器#1                  x86 Family 6 Model 15 Stepping 13 GenuineIntel ~1994 Mhz

                 處理器#2                  x86 Family 6 Model 15 Stepping 13 GenuineIntel ~1994 Mhz

                 總的物理內(nèi)存              1,024.00 MB X 2, DDRII 667Mhz

                 BIOS 版本/日期          Phoenix Technologies LTD R1100Q0, 2007-10-18

·測試結(jié)果

 

·結(jié)果分析

    這里需要說明的一點是:因為語法分析器只是是整個編譯器的一部分,所以在測試語法分析器時一定要加上如下的宏:

//-------------------------parser.cpp-----------------------------

#include "parser.h"

#define PARSER_DEBUG

……

五、總結(jié)與體會

語法分析是編譯器的重要階段之一,可以認為是語法制導翻譯模式編譯器的核心。語法分析也有雙重含義:根據(jù)一定的規(guī)則構(gòu)成語言的各種結(jié)構(gòu),即語法規(guī)則;根據(jù)語法規(guī)則識別輸入序列(記號流)中的語言結(jié)構(gòu),即語法法分析。同詞法分析比較,語法分析的不是記號,而是組成語言的句子,從結(jié)構(gòu)上講不是線性的而是層次的,表征這種結(jié)構(gòu)的最好方法是樹,從而使得語法的分析就有了從根到葉子和從葉子到根兩種分析方法。由于語言結(jié)構(gòu)的復雜性,語法規(guī)則的描述也相應困難。

在上機實踐中我們也發(fā)現(xiàn):對于規(guī)模比較小的語言,遞歸下降子程序方法是很有效的方法,它簡單靈活,容易構(gòu)造,其缺點是程序與文法直接相關(guān),對文法的任何改變均需對程序進行相應的修改。

附:源代碼清單

 

posted on 2010-02-11 13:05 肥仔 閱讀(2780) 評論(0)  編輯 收藏 引用 所屬分類: 狀態(tài)機 & 自動機 & 形式語言

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品人人爽| 亚洲精品视频一区二区三区| 欧美mv日韩mv国产网站app| 欧美日韩国产麻豆| 亚洲国产精品尤物yw在线观看| 亚洲日本成人| 欧美日韩视频一区二区| 亚洲日本电影| 亚洲日本中文字幕免费在线不卡| 欧美+日本+国产+在线a∨观看| 在线播放一区| 最新国产拍偷乱拍精品| 欧美日韩国产精品一区| 中文精品一区二区三区| 99热这里只有精品8| 国产精品久久99| 久久精品一区二区| 欧美不卡视频一区发布| 亚洲精品影院在线观看| 亚洲国产精品福利| 欧美三级午夜理伦三级中文幕 | 午夜精品久久久久影视| 亚洲欧洲精品一区二区精品久久久| 久久手机精品视频| 亚洲桃色在线一区| 性欧美xxxx视频在线观看| 在线日韩欧美| 妖精视频成人观看www| 国产亚洲精品久久久久动| 蜜桃av久久久亚洲精品| 欧美激情第二页| 久久不射电影网| 欧美日韩成人一区| 亚洲一区成人| 麻豆久久婷婷| 久久av一区| 亚洲人成网站999久久久综合| 91久久精品视频| 亚洲女性裸体视频| 亚洲国产精品成人精品| 夜夜嗨av一区二区三区网页| 欧美区国产区| 性色av一区二区三区在线观看| 午夜精品久久久久久久99黑人| ●精品国产综合乱码久久久久| 亚洲午夜精品| 亚洲永久免费视频| 欧美国产一区在线| 亚洲国产美女精品久久久久∴| 国产一区二区三区久久| 亚洲免费网址| 久久精品99久久香蕉国产色戒| 欧美日韩一区三区四区| 亚洲国产成人精品女人久久久| 亚洲电影免费在线观看| 欧美一区二区高清| 欧美一区二区三区免费看| 国产精品狼人久久影院观看方式| 亚洲精品日日夜夜| 亚洲一级二级在线| 国产精品毛片| 久久婷婷国产综合国色天香| 老鸭窝亚洲一区二区三区| 一区视频在线| 欧美日韩a区| 亚洲欧美另类在线观看| 嫩草伊人久久精品少妇av杨幂| 亚洲国产精品一区| 欧美成人国产va精品日本一级| 亚洲精品123区| 欧美在线播放| 亚洲免费观看在线观看| 性欧美暴力猛交69hd| 国产曰批免费观看久久久| 亚洲免费影视第一页| 亚洲欧美日韩视频二区| 国产色产综合色产在线视频| 久久亚洲影音av资源网| 一区二区成人精品| 老司机久久99久久精品播放免费| 亚洲国产精品一区在线观看不卡| 欧美精品国产精品| 久久久久成人精品| 亚洲影音先锋| 99re这里只有精品6| 欧美激情一区二区在线 | 香港久久久电影| 尤物99国产成人精品视频| 国产精品yjizz| 欧美视频在线观看一区| 亚洲欧美日韩电影| 久久久久亚洲综合| 久久aⅴ国产紧身牛仔裤| 亚洲欧美经典视频| 亚洲精品国久久99热| 欧美国产日韩视频| 蜜桃久久精品乱码一区二区| 欧美一区二区三区日韩| 亚洲一区二区三区视频播放| 一本色道久久综合亚洲精品不卡 | 亚洲精品在线观看视频| 欧美a级大片| 欧美激情一区二区三区蜜桃视频 | 日韩网站在线观看| 91久久精品国产91久久| 亚洲人成人一区二区三区| 亚洲精品在线观| 亚洲女同性videos| 久久天天躁狠狠躁夜夜爽蜜月| 欧美一区二区三区四区视频| 久久精品成人| 欧美精品123区| 国产精品一区二区久久久久| 国产综合久久久久久鬼色| 亚洲全黄一级网站| 欧美一区二区三区视频在线| 亚洲激情视频在线观看| 欧美一区二区成人| 国产精品视频一二| 国产亚洲欧美日韩精品| 国产一区清纯| 狠狠色噜噜狠狠色综合久| 一区二区三区视频在线看| 久久综合中文字幕| 午夜精品美女久久久久av福利| 裸体一区二区三区| 国产日韩欧美综合精品| 亚洲性视频h| 日韩一区二区高清| 午夜久久久久久久久久一区二区| 国产精品扒开腿做爽爽爽软件| 亚洲黄色免费网站| 免费人成精品欧美精品| 欧美在线高清视频| 国内揄拍国内精品少妇国语| 在线一区二区日韩| 亚洲日韩欧美视频一区| 欧美激情精品久久久久久黑人| 伊人久久综合97精品| 免费在线视频一区| 久久久久久色| 欧美日韩不卡合集视频| 欧美激情1区| 一区在线影院| 久久国产直播| 久久久精品动漫| 国产一区三区三区| 亚洲欧美综合网| 午夜精品偷拍| 亚洲国产成人精品女人久久久| 久久久久久久久久久久久久一区 | 欧美成人dvd在线视频| 有码中文亚洲精品| 亚洲国产精品va在线观看黑人| 亚洲久久一区| 国产伦精品一区二区三区照片91| 中文国产成人精品久久一| 亚洲一区在线免费| 欧美大片免费久久精品三p| 一本色道久久综合亚洲精品不 | 亚洲成色777777在线观看影院 | 欧美午夜精品| 久久本道综合色狠狠五月| 久久久www免费人成黑人精品 | 免费观看亚洲视频大全| 亚洲欧美日韩综合| 欧美激情中文字幕乱码免费| 欧美福利视频| 巨乳诱惑日韩免费av| 欧美日韩123| 欧美成人免费va影院高清| 欧美日韩综合精品| 亚洲欧洲视频| 国产一区二区电影在线观看| 亚洲国产欧洲综合997久久| 狠狠88综合久久久久综合网| 欧美国产日韩在线| 午夜精品一区二区三区在线播放| 亚洲第一二三四五区| 久久精品二区亚洲w码| 久久久精品一品道一区| 国产精品福利在线观看| 国产日韩精品一区| 欧美伊久线香蕉线新在线| 女主播福利一区| 亚洲精品永久免费| 国产精品夜色7777狼人| 久久夜色精品国产噜噜av| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲视频你懂的| 羞羞漫画18久久大片| 亚洲第一成人在线| 国产片一区二区| 欧美日韩一二三四五区| 亚洲精品一区在线| 欧美成人一区二区三区| 久久全国免费视频| 香港成人在线视频| 欧美一区二区成人| 亚洲一区二区在线免费观看|