gpt4 book ai didi

ruby - 最简单的树顶语法返回一个解析错误,只是学习

转载 作者:数据小太阳 更新时间:2023-10-29 08:53:40 26 4
gpt4 key购买 nike

我正在尝试学习 treetop 并且正在使用 https://github.com/survival/lordbishop 中的大部分代码用于解析名称,并打算以此为基础构建。

我的结构有点不同,因为我是在 rails 中构建它,而不是在 ruby​​ 命令行中构建它。

当我运行一个非常简单的解析时,我在一个空格上返回了一个解析错误(这应该是我语法中最简单的事情之一。我做错了什么?

我的代码在我的模型中相当简单

require 'treetop'require 'polyglot'require 'grammars/name'class Name      def self.parse(data)           parser = FullNameParser.new           tree = parser.parse(data)           if tree.nil?              return "Parse error at offset: #{parser.index}"           end           result_hash = {}           tree.value.each do |node|              result_hash[node[0] = node[1].strip if node.is_a?(Array) && !node[1].blank?           end           return result_hash      endend

我已经剥离了大部分语法,只剩下单词和空格

grammar FullName    rule word        [^\s]+ {        def value            text_value        end        }    end    rule s        [\s]+ {        def value            ""        end        }    endend

我正在尝试解析“john smith”,我希望只返回单词和空格并从那里构建我的逻辑,但我什至停留在这个简单的级别。有什么建议吗??

最佳答案

据我所知,treetop 从语法中的第一条规则开始解析(规则 word,在您的例子中!)。现在,如果您输入的是 'John Smith'(即:wordsword),它会停止第一次匹配规则word后解析。并在遇到第一个 s 时产生错误,因为 words 不匹配。

您需要在描述整个名称的语法顶部添加一条规则:即一个词,后跟一个空格,再跟一个词,等等。

grammar FullName

rule name
word (s word)* {
def value
text_value
end
}
end

rule word
[^\s]+ {
def value
text_value
end
}
end

rule s
[\s]+ {
def value
text_value
end
}
end

end

使用脚本进行快速测试:

#!/usr/bin/env ruby

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'FullName'

parser = FullNameParser.new
name = parser.parse('John Smith').value
print name

将打印:

John Smith

关于ruby - 最简单的树顶语法返回一个解析错误,只是学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com