gpt4 book ai didi

ruby - 帕斯莱特 : exclusion clause

转载 作者:太空宇宙 更新时间:2023-11-03 17:08:34 25 4
gpt4 key购买 nike

我目前正在使用 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

我如何使用 Parslet 翻译它?也许缺席?/现在?东西?

非常感谢,希望有人有想法....

祝你有美好的一天!

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

  rule(:line_comment){(source_character.repeat >> line_terminator >> source_character.repeat).absent? >> source_character.repeat(1)}

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

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

# 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

我用这段代码制定了这些规则:

# Code to test : 
code = "test
"

但我明白了:

Failed to match sequence (SOURCE_CHARACTER{0, } LINE_TERMINATOR) at line 2 char 1. - Failed to match sequence (SOURCE_CHARACTER{0, }
LINE_TERMINATOR) at line 2 char 1.
- Failed to match sequence (' ' ' '?) at line 2 char 1. `- Premature end of input at line 2 char 1. nil

如果这个序列不起作用,我上面的“完整”规则将永远不起作用……如果有人有想法,那就太好了。

谢谢!

最佳答案

你可以这样做:

rule(:word) { match['^")(\\s'].repeat(1) } # normal word
rule(:op) { str('AND') | str('OR') | str('NOT') }
rule(:keyword) { str('all:') | str('any:') }
rule(:searchterm) { keyword.absent? >> op.absent? >> word }

在这种情况下,absent? 进行前瞻以确保下一个标记不是关键字;如果不是,则检查以确保它不是运算符(operator);如果不是,最后看看它是否是一个有效的 word

等效的规则是:

rule(:searchterm) { (keyword | op).absent? >> word }

关于ruby - 帕斯莱特 : exclusion clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8223830/

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