Yahoo奇摩知識+ 將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+ 網站將會轉為唯讀模式。其他 Yahoo奇摩產品與服務或您的 Yahoo奇摩帳號都不會受影響。如需關於 Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

丫灼
Lv 4
丫灼 發問時間: 電腦與網際網路程式設計 · 1 0 年前

什麼是parser?10點

關於寫程式的東西

聽到人家說 parser

到底什麼是 parser ?

p.s.請解釋清楚 , thanks

已更新項目:

小琪 你好

所以 parser 最主要的功能是在分析語法嗎 ? ( 為什麼要分析語法 ? )

compiler 不就可以分析語法嗎 ? ( 語法錯 compiler 會找出 )

為什麼不用 compiler 就好 ?

還是 parser 是包含在 compiler 裡 ?

有句話你說到

12 可用 int 表示,所以 12 被示為 int (2)

是 int (12) 還是 int (2) ?

Parser 產生器是的功能是 ? 檢查語法嗎 ?

感謝你的回答

2 個已更新項目:

小琪 你好

compiler 的課程會教 parser 嗎 ?

如果我純粹只寫 C , 會用到 parser 嗎 ?

thanks

2 個解答

評分
  • ?
    Lv 5
    1 0 年前
    最佳解答

    怕死 (Parse) 的人叫 Parser!

    圖片參考:http://tw.yimg.com/i/tw/blog/rte/smiley_4.gif

    不鬧了。

    Parse 是語法分析,parser 是語法分析,它是 compiler 的第一步。

    小琪小姐,您說錯了!之前還有一個前置處理器 (Preprocesser)!

    那要看你對 compiler 的定義了!

    Preprocesser 基本上只做了字串置換的動作,沒有做其它的事。

    (有的語言介面 (language shell) 的前置處理器會多做一點事,

     超過範圍,不多談。)

    Parser 基本上先把程式切成代碼 (token),並把多數類型的代碼建表。

    (通常只要不是常數的 token 都要建表。)

    然後由 token 及 表 去,用給定的語言的文法 (grammar, 通常是用 formal language grammar / context-free grammar)去分析、化簡,

    要是不合文法,就給錯誤訊息。

    一般的程式語言都是 context-free language,除了一點例外:變數型態!

    因為,context-free language 很容易寫出快速且有效的 Parser。

    Parser 大約包含三部份:

     (1) Lexical analysis (產生 token)

     (2) Token analysis

     (3) Syntactic analysis (把 token 建成樹 (更完整的表),叫 parse-tree)

    如:(以 C 為例)

     12*(3+4)^2 就被建出:12, *, (, 3, +, 4, ), ^ 和 2 這些 token (1)

     12 可用 int 表示,所以 12 被示為 int (2)

     常看到人在問什麼前/中/後序,就是 (3):把這個算式建成樹,再看怎麼處理。

    Parser 可分為兩大類:Top-down (如:LL, recursive, ... (leftmost)) 和 Button-up (如:LR (又稱 Shift-Reduce) (rightmost))。

    簡言之:一個效果好,一個好學。

    Parser 只管文法錯誤,語義(semantic)錯誤不在它管轄的範圍。

    如:

     我生了一塊石頭。 文法全對;但意思不對!

     一打筆是15隻。  這就不一定了!有的會抓出枝,有的不會。

              但,Parser 是一定不會管那個該是15還是12的!

    parser 並不會管這種事。

    現代有不少 Parser 產生器!所以,通常不用自己去寫 Parser。

    YACC 是最出名的。也有不少版,所以,我給的並不是直接去 YACC 的 Link。

    哪裡不懂可以再問。

    2008-02-05 12:10:39 補充:

    Parser 是 Compiler 的第一部份。

    就像炒菜要先開火一樣。

    不分析語法,怎知程式寫的對不對?

    如:你能給用數字當變數名稱的開頭嗎?

    所以,compiler 出語法錯誤,是它的第一步驟:Parser 找出來的。

    類似炒菜,不開火,會熱嗎?

    只有油和菜、水、鹽等,炒出來的菜怎會是熱的?

    12 可用 int 表示,所以 12 被示為 int (2)

    那個 (2) 是我上面寫的 (2) Token Analysis

    Parser 產生器是的功能是:

    幫你產生一個 Parser,可以拿來檢查一個程式,是不是合於你設定的語法。

    它是給 學/寫/設計Compiler 的人用的。

    2008-02-05 23:54:36 補充:

    Compiler 的課必教 Parser → Code Generator → Optimizer → Linker 這些東東。

    (現代的 Compiler ,特別為了 Optimizer,流程已不像上述那麼簡單。)

    你使用 compiler 時,它會自己幫你先用它的 Parser Parse 過你的程式。

    就像你到餐廳點菜,不用擔心,廚師會幫你用火加熱的!

     除非,你點的是生魚片或生菜、冷盤、冰品。

    2008-02-06 00:42:54 補充:

    高階語言譯成可執行的程式有三種譯法:Assembler, Compiler 和 Interpreter。

    只要是 Compiler,一定會有 Parser!

    (Assember 和 Interpreter 也有類的動作,但好像不叫 Parser,要查一下。)

    你用 C,它是用 Compiler 來翻譯的語言,必定用到 Parser。

  • SiYu
    Lv 5
    1 0 年前

    parser 不一定用在程式語言上

    廣義來說. 只要對文字作特定的處理都可以稱作是parser

    如html 的檔要顯示出來也要通過一個parser

    XML 的parser. 連通訊協定也是要通過一個parser

    如http 的通訊協定.

    2008-02-13 13:53:55 補充:

    所以.他的使用範疇非常的廣泛. 個人一直很痛恨自己學不會一套parser tool .. 因為他的重要性實再太高了.

還有問題?馬上發問,尋求解答。