标签: parslet

在Ruby中使用Parslet的缩进敏感解析器?

我试图使用Ruby中的Parslet库解析一个简单的缩进敏感语法.

以下是我尝试解析的语法示例:

level0child0
level0child1
  level1child0
  level1child1
    level2child0
  level1child2
Run Code Online (Sandbox Code Playgroud)

生成的树看起来像这样:

[
  {
    :identifier => "level0child0",
    :children => []
  },
  {
    :identifier => "level0child1",
    :children => [
      {
        :identifier => "level1child0",
        :children => []
      },
      {
        :identifier => "level1child1",
        :children => [
          {
            :identifier => "level2child0",
            :children => []
          }
        ]
      },
      {
        :identifier => "level1child2",
        :children => []
      },
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我现在的解析器可以解析嵌套级别0和1节点,但不能解析过去:

require 'parslet'

class IndentationSensitiveParser < Parslet::Parser

  rule(:indent) { str('  ') }
  rule(:newline) { str("\n") }
  rule(:identifier) …
Run Code Online (Sandbox Code Playgroud)

ruby parsing indentation parslet

10
推荐指数
1
解决办法
885
查看次数

Ruby parslet:解析多行

我正在寻找一种匹配多行Parslet的方法.代码如下所示:

rule(:line) { (match('$').absent? >> any).repeat >> match('$') }
rule(:lines) { line.repeat }
Run Code Online (Sandbox Code Playgroud)

但是,lines总是会以无限循环结束,因为match('$')它将无休止地重复以匹配字符串的结尾.

是否可以匹配多个可以为空的行?

irb(main)> lines.parse($stdin.read)
This
is

a
multiline

string^D
Run Code Online (Sandbox Code Playgroud)

应该匹配成功.我错过了什么吗?我也试过,(match('$').absent? >> any.maybe).repeat(1) >> match('$')但这与空行不匹配.

此致,
Danyel.

ruby lines parslet

5
推荐指数
2
解决办法
1338
查看次数

Parslet:排除条款

我目前正在使用Ruby编写Ruby解析器,更准确地说是Parslet,因为我认为它比Treetop或Citrus更容易使用.我使用官方规范创建我的规则,但有一些我不能写的语句,因为它们"排除"了一些语法,我不知道怎么做......嗯,这里有一个例子供你理解. ..

这是一个基本规则:

foo::=
any-character+ BUT NOT (foo* escape_character barbar*)
# Knowing that (foo* escape_character barbar*) is included in any-character
Run Code Online (Sandbox Code Playgroud)

我怎么能用Parslet翻译呢?也许是缺席?/现在?东西 ?

非常感谢,希望有人有个主意....

祝你今天愉快!

编辑:我试过你说的,所以这是我使用parslet翻译成Ruby语言:

  rule(:line_comment){(source_character.repeat >> line_terminator >> source_character.repeat).absent? >> source_character.repeat(1)}
Run Code Online (Sandbox Code Playgroud)

但是,它似乎不起作用(parens中的序列).我做了一些测试,并得出结论,我的parens中写的是错误的.

这是一个非常简单的例子,让我们考虑以下规则:

# Parslet rules
rule(:source_character) {any}
rule(:line_terminator){ str("\n") >> str("\r").maybe }  

rule(:not){source_character.repeat >> line_terminator }
# Which looks like what I try to "detect" up there
Run Code Online (Sandbox Code Playgroud)

我这些规则与这些代码:

# Code to test : 
code = "test
"
Run Code Online (Sandbox Code Playgroud)

但我明白了:

无法匹配第2行char 1处的序列(SOURCE_CHARACTER {0,} LINE_TERMINATOR).- Failed to match sequence (SOURCE_CHARACTER{0, …

ruby parsing parslet

1
推荐指数
2
解决办法
1133
查看次数

标签 统计

parslet ×3

ruby ×3

parsing ×2

indentation ×1

lines ×1