本文简要介绍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模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。