2014-12-25 42 views
0

我正在尝试学习与Treetop PEG语法分析器一起工作,但我从一开始就感到奇怪的错误。Ruby&Treetop - 没有这样的文件或目录@ rb_sysopen

我有文件的

node_extensions.rb parser.rb   tranlan.treetop 

和内容是以下这个文件结构(列表是上面列出文件的顺序)

node_extensions.rb

# node_extensions.rb 
module TranLan 

end 

parser.rb

# parser.rb 
require 'treetop' 

# Find out what our base path is 
base_path = File.expand_path(File.dirname(__FILE__)) 

# Load our custom syntax node classes so the parser can use them 
require File.join(base_path, 'node_extensions.rb') 

class Parser 
    base_path = File.expand_path(File.dirname(__FILE__)) 
    Treetop.load(File.join(base_path, 'tranlan_parser.treetop')) 
    @@parser = SexpParser.new 

    def self.parse(data) 
    tree = @@parser.parse(data) 
    raise Exception, "Parser error at offset: #{@@parser.index}" if tree.nil? 
    tree 
    end 
end 

tranlan.treetop

# tranlan.treetop 
grammar TranLan 

end 

当我运行parser.rb,我得到这个错误

/Users/maca/.rvm/gems/ruby-2.1.4/gems/treetop-1.5.3/lib/treetop/compiler/grammar_compiler.rb:37:in `initialize': No such file or directory @ rb_sysopen - /Users/maca/devel/playground/treetop-grammar/tranlan_parser.treetop (Errno::ENOENT) 
from /Users/maca/.rvm/gems/ruby-2.1.4/gems/treetop-1.5.3/lib/treetop/compiler/grammar_compiler.rb:37:in `open' 
from /Users/maca/.rvm/gems/ruby-2.1.4/gems/treetop-1.5.3/lib/treetop/compiler/grammar_compiler.rb:37:in `load' 
from parser.rb:17:in `<class:Parser>' 
from parser.rb:10:in `<main>' 

有什么不对?任何帮助?

+2

您已创建tranlan.treetop,但您正在加载tranlan_parser.treetop –

+0

嘿,你是对的。我是一个白痴。谢谢!!! –

+0

@FrederickCheung,请定期回答,以便我可以将其标记为正确答案。非常感谢。 –

回答

1

你有多个错误:

  • 你要加载的,而不是tranlan tranlan_parser
  • 您试图加载.treetop文件,但它被称为.TT
  • 你试图实例SexpParser但是你创建了TranLanParser
  • TranLanParser没有规则,所以没有顶级规则,因此不包含解析器
  • 你不需要做所有那些花哨的文件名注册。只需要这些文件。
  • 你并不需要一个解析器类,树顶生成一个适合你(重新打开它来扩展它)

这是一个开始。修复这些问题,你就可以开始编写语法。

相关问题