当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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