我试图使用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) 我正在寻找一种匹配多行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编写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, …