- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在调查 parslet写了很多数据导入代码。总的来说,图书馆看起来不错,但我正在努力解决一件事。我们的很多输入文件都是固定宽度的,并且宽度因格式而异,即使实际字段没有。例如,我们可能会得到一个包含 9 个字符货币的文件,而另一个文件包含 11 个字符(或其他)。有谁知道如何在 parslet 原子上定义固定宽度约束?
理想情况下,我希望能够定义一个理解货币的原子(带有可选的美元符号、千位分隔符等...)然后我将能够即时创建一个基于旧的完全等效,只是它正好解析 N 个字符。
parslet 中是否存在这样的组合器?如果没有,自己写一个可能/困难吗?
最佳答案
像这样的东西怎么样......
class MyParser < Parslet::Parser
def initialize(widths)
@widths = widths
super
end
rule(:currency) {...}
rule(:fixed_c) {currency.fixed(@widths[:currency])}
rule(:fixed_str) {str("bob").fixed(4)}
end
puts MyParser.new.fixed_str.parse("bob").inspect
这将失败:
"Expected 'bob' to be 4 long at line 1 char 1"
方法如下:
require 'parslet'
class Parslet::Atoms::FixedLength < Parslet::Atoms::Base
attr_reader :len, :parslet
def initialize(parslet, len, tag=:length)
super()
raise ArgumentError,
"Asking for zero length of a parslet. (#{parslet.inspect} length #{len})" \
if len == 0
@parslet = parslet
@len = len
@tag = tag
@error_msgs = {
:lenrep => "Expected #{parslet.inspect} to be #{len} long",
:unconsumed => "Extra input after last repetition"
}
end
def try(source, context, consume_all)
start_pos = source.pos
success, value = parslet.apply(source, context, false)
return succ(value) if success && value.str.length == @len
context.err_at(
self,
source,
@error_msgs[:lenrep],
start_pos,
[value])
end
precedence REPETITION
def to_s_inner(prec)
parslet.to_s(prec) + "{len:#{@len}}"
end
end
module Parslet::Atoms::DSL
def fixed(len)
Parslet::Atoms::FixedLength.new(self, len)
end
end
关于ruby - 如何在 parslet 中定义固定宽度约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5540297/
我已经开始使用 Parslet 来解析一些自定义数据。在示例中,生成的解析数据类似于: { :custom_string => "data"@6 } 我创建了类似 Transform 的东西 rule
有没有一种方法可以类似于典型正则表达式中的 \1 功能来反向引用 parslet 中的前一个字符串? 我想提取 block 中的字符,例如: Marker SomeName some random
对于下面的Parslet解析器 require 'parslet' require 'parslet/convenience' class Lines > data >> close_tag }
Resume(我把下面的长篇大论缩成了简单的问题) tree = {:properties => [{:a => 'b'}, {:c => 'd'}]} big_tree = {:properties
我有以下规范 it "parses a document with only an expression" do puts parser.document.should parse("[b
我正在尝试为 Handlebars 编写一个 Ruby/Parslet 解析器,但我被 {{ else }} 关键字困住了。为了给那些不使用 Handlebars 的人解释 brieflt,一个 if
我正在研究一种新的编程语言 rip ,而且我无法找到一些无限循环的底部。有没有办法在每个规则被调用时打印出来,这样我就可以看到递归的规则?我试过在脑海中遍历代码,但我就是看不到它。任何帮助将不胜感激。
我正在调查 parslet写了很多数据导入代码。总的来说,图书馆看起来不错,但我正在努力解决一件事。我们的很多输入文件都是固定宽度的,并且宽度因格式而异,即使实际字段没有。例如,我们可能会得到一个包含
为什么以下 Parslet 解析器无法解析以逗号分隔的列表?当我解析时,它卡住了并且不提供错误消息: class TestParser > str(',').maybe } rule(:names
我正在寻找一种匹配多行 Parslet 的方法。代码如下所示: rule(:line) { (match('$').absent? >> any).repeat >> match('$') } rul
我正在尝试使用 Parslet 解析简单的缩进敏感语法Ruby 中的库。 以下是我尝试解析的语法示例: level0child0 level0child1 level1child0 level
我正在玩 parslet。这是一个简单的解析器,它向我展示了一些不明显的行为。 require 'parslet' class Parser > term >> quote end rule(
以 Parslet 中的代码示例作为起点自己的创建者(在此 link 中可用)我需要对其进行扩展,以便从以类 C 语法编写的文件中检索所有未注释的文本。 提供的示例能够成功解析 C 风格注释,将这些区
我有一个 Flexlm/Flexnet 许可服务,我想解析这个服务的输出。所有输出都是多行的结构化 block 。我的第一步是解析 lmutil lmstat -c -a 的输出使用许可证和增量。
我是一名优秀的程序员,十分优秀!