本文簡要介紹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 Ractor.receive_if用法及代碼示例
- Ruby Ractor.close_incoming用法及代碼示例
- Ruby Ractor.count用法及代碼示例
- Ruby Ractor.shareable?用法及代碼示例
- Ruby Ractor.current用法及代碼示例
- Ruby Ractor.new用法及代碼示例
- Ruby Ractor.receive用法及代碼示例
- Ruby Ractor.close_outgoing用法及代碼示例
- Ruby Ractor.yield用法及代碼示例
- Ruby Ractor.send用法及代碼示例
- Ruby Ractor.take用法及代碼示例
- Ruby Ractor.make_shareable用法及代碼示例
- Ruby Ractor類用法及代碼示例
- Ruby Ractor.select用法及代碼示例
- Ruby Range.end用法及代碼示例
- Ruby Range new()用法及代碼示例
- Ruby Rational.inspect用法及代碼示例
- Ruby Random.bytes用法及代碼示例
- Ruby Random hex()用法及代碼示例
- Ruby Range.size用法及代碼示例
- Ruby Rational.rational <=>用法及代碼示例
- Ruby Rational to_i()用法及代碼示例
- Ruby Rational.rat ** numeric用法及代碼示例
- Ruby Random random_number()用法及代碼示例
- Ruby Range last()用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Racc模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。