- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在使用 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, }
- Failed to match sequence (' ' ' '?) at line 2 char 1. `- Premature end of input at line 2 char 1. nil
LINE_TERMINATOR) at line 2 char 1.
如果这个序列不起作用,我上面的“完整”规则将永远不起作用……如果有人有想法,那就太好了。
谢谢!
最佳答案
你可以这样做:
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/
我是一名优秀的程序员,十分优秀!