Доступ к методам связывания с узлом в Treetop - PullRequest
1 голос
/ 06 июня 2011

С грамматикой, определенной ниже, почему я продолжаю получать ошибку при попытке доступа к val методу узлов, созданных правилом key?

Сообщение об ошибке:

(eval):168:in `val': undefined local variable or method `key'
for #<Treetop::Runtime::SyntaxNode:0x00000101b1e160> (NameError)

Грамматика

grammar Command
  rule create_command
    'create' space pair {
      def val
        pair.val
      end
    }
  end

  rule pair
    key space? '=' space? '"' value '"' {
      def val
        { key.val => value.val }
      end
    }
  end

  rule key
    [A-Za-z_] [A-Za-z0-9_]* {
      def val
        key.to_sym
      end
    }
  end

  rule value
    ('\\"' / [^"])+ {
      def val
        value.to_s
      end
    }
  end

  rule space
    [ \t]+
  end
end

Тестовый код

require 'treetop'
Treetop.load "command"
p = CommandParser.new
r = p.parse 'create name = "foobar"'
p r.val

1 Ответ

1 голос
/ 07 июня 2011

Вы можете получить доступ к содержимому самого правила через text_value. Грамматика:

grammar Command

  rule create_command
    'create' space pair {
      def val
        pair.val
      end
    }
  end

  rule pair
    key space? '=' space? '"' value '"' {
      def val
        { key.val => value.val }
      end
    }
  end

  rule key
    [A-Za-z_] [A-Za-z0-9_]* {
      def val
        text_value
      end
    }
  end

  rule value
    ('\\"' / [^"])+ {
      def val
        text_value
      end
    }
  end

  rule space
    [ \t]+
  end

end

, который можно проверить с помощью:

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'command'

parser = CommandParser.new
pair = parser.parse('create name = "foobar"').val
print pair['name'], "\n"

и напечатает:

foobar

к консоли.

...