當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Ruby Racc模塊用法及代碼示例


本文簡要介紹ruby語言中 Racc模塊 的用法。

Racc 是一個 LALR(1) 解析器生成器。它是用 Ruby 本身編寫的,並生成 Ruby 程序。

命令行參考

racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
     [-e<var>rubypath</var>] [--executable=<var>rubypath</var>]
     [-v] [--verbose]
     [-O<var>filename</var>] [--log-file=<var>filename</var>]
     [-g] [--debug]
     [-E] [--embedded]
     [-l] [--no-line-convert]
     [-c] [--line-convert-all]
     [-a] [--no-omit-actions]
     [-C] [--check-only]
     [-S] [--output-status]
     [--version] [--copyright] [--help] <var>grammarfile</var>
grammarfile

Racc 語法文件。允許任何擴展。

-o+outfile+, -output-file= outfile

用於輸出的文件名。默認為 < filename >.tab.rb

-O+文件名+, -log-file= filename

將日誌記錄輸出放在文件 filename 中。默認日誌文件名為 < filename >.output。

-e+rubypath+, -executable= rubypath

輸出可執行文件(模式 755)。其中 path 是 Ruby 解釋器。

-v,-詳細

詳細模式。創建 filename .output 文件,如 yacc 的 y.output 文件。

-g,-調試

將調試代碼添加到解析器類。要顯示調試信息,請使用此“-g”選項並在解析器類中設置 @yydebug 為真。

-E,-嵌入式

不需要運行時文件的輸出解析器 (racc/parser.rb)。

-C, -check-only

檢查racc語法文件的語法並退出。

-S, -output-status

編譯時不時打印消息。

-l, -no-line-convert

關閉行號轉換。

-c, -line-convert-all

轉換動作、內部、頁眉和頁腳的行號。

-a, -no-omit-actions

調用所有操作,即使操作為空。

-版本

打印 Racc 版本並退出。

-版權

打印版權並退出。

-幫助

打印使用情況並退出。

使用 Racc 生成 Parser

要編譯 Racc 語法文件,隻需鍵入:

$ racc parse.y

這將創建 Ruby 腳本文件 “parse.tab.y”。 -o 選項可以更改輸出文件名。

寫 A Racc Grammar File

如果你想要自己的解析器,你必須編寫一個語法文件。語法文件包含解析器類的名稱、解析器的語法、用戶代碼和其他任何內容。在編寫語法文件時,yacc 的知識很有幫助。如果你之前沒有使用過yacc, Racc 並不太難。

這是一個示例 Racc 語法文件。

class Calcparser
rule
  target: exp { print val[0] }

  exp: exp '+' exp
     | exp '*' exp
     | '(' exp ')'
     | NUMBER
end

Racc 語法文件類似於 yacc 文件。但是(當然),這是 Ruby 代碼。 yacc的$$是‘result’,$0,$1…是一個叫‘val’的數組,$-1,$-2…是一個叫‘_values’的數組。

有關語法文件的更多信息,請參閱語法文件參考。

Parser

然後你必須準備解析入口方法。 Racc 中有兩種解析方法,Racc::Parser#do_parse 和 Racc::Parser#yyparse

Racc::Parser#do_parse 很簡單。

是yacc的yyparse(), Racc::Parser#next_token 是yylex()。此方法必須返回一個類似 [TOKENSYMBOL, ITS_VALUE] 的數組。 EOF 是 [假,假]。 (TOKENSYMBOL 是一個 Ruby 符號(取自 String#intern )默認情況下。如果您想更改它,請參閱語法參考。

Racc::Parser#yyparse 有點複雜,但很有用。它不使用 Racc::Parser#next_token ,而是從任何迭代器獲取令牌。

例如,yyparse(obj, :scan) 會導致調用 +obj#scan+,您可以通過從 +obj#scan+ 生成令牌來返回令牌。

調試

調試時,“-v” 或/和“-g” 選項很有幫助。

“-v” 創建詳細日誌文件 (.output)。 “-g” 創建一個“Verbose Parser”。 Verbose Parser 在解析時打印內部狀態。但它是not 自動的。您必須使用 -g 選項並將 +@yydebug+ 設置為 true 才能獲得輸出。 -g 選項僅創建詳細解析器。

Racc 報告語法錯誤。

“end”是不是太多了?在 v0.10 中更改了 racc 文件的語法。

Racc 不使用“%”標記,而 yacc 使用大量“%”標記。

Racc 報告了 “XXXX conflicts”。

試試“racc -v xxxx.y”。它會導致生成 racc 的內部日誌文件 xxxx.output。

生成的解析器無法正常工作

試試“racc -g xxxx.y”。此命令讓 racc 生成“debugging parser”。然後在你的解析器中設置@yydebug=true。它會生成解析器的工作日誌。

重新分發 Racc 運行時

Racc 創建的解析器需要 Racc 運行時模塊; racc/parser.rb。

Ruby 1.8.x 帶有 Racc 運行時模塊,您不需要分發 Racc 運行時文件。

如果您想在解析器中包含 Racc 運行時模塊。這可以通過使用“-E”選項來完成:

$ racc -E -omyparser.rb myparser.y

此命令創建 myparser.rb,其中 ‘includes’ Racc 運行時。隻有您必須做的是分發您的解析器文件(myparser.rb)。

注意:parser.rb 是 ruby 許可證,但您的解析器不是。您自己的解析器完全屬於您。

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Racc模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。