gpt4 book ai didi

parsing - Rebol 解析中匹配失败的错误消息

转载 作者:行者123 更新时间:2023-12-02 20:54:53 26 4
gpt4 key购买 nike

基于 PEG 的解析器生成器通常对无效输入提供有限的错误报告。据我了解,rebol 的解析方言受到正则表达式扩展的 PEG 语法的启发。

例如,在 JavaScript 中输入以下内容:

d8> function () {}

给出以下错误,因为在声明全局函数时没有提供标识符:

(d8):1: SyntaxError: Unexpected token (
function () {}
^

解析器能够在解析过程中精确定位预期标记丢失的位置。预期标记的字符位置用于定位错误消息中的箭头。

rebol 中的解析方言是否提供内置工具来报告无效输入的行和列错误?

否则,是否有提供此类错误报告的自定义推出解析规则的示例?

最佳答案

我已经完成了非常先进的 Rebol 解析器,用于管理实时和关键任务 TCP 服务器,并且需要进行正确的错误报告。所以这很重要!

Rebol 的 PARSE 最独特的方面之一可能是您可以在规则中包含直接评估。因此,您可以设置变量来跟踪解析位置或错误消息等。(这非常简单,因为 Rebol 的本质是将代码和数据混合为同一事物是一个核心思想。)

这就是我的做法。在尝试每个匹配规则之前,我将解析位置保存到“此处”(通过编写 here:),然后使用代码执行将错误保存到变量中(通过输入 (error: {some error string}) 放在括号中,以便解析方言运行它)。如果匹配规则成功,我们不需要使用错误或位置......我们只需继续下一个规则。但如果失败,我们将获得失败后设置的最后一个状态报告。

因此解析方言中的模式很简单:

; use PARSE dialect handling of "set-word!" instances to save parse
; position into variable named "here"

here:

; escape out of the parse dialect using parentheses, and into the DO
; dialect to run arbitrary code. Here we run code that saves an error
; message string into a variable named "error"

(error: "<some error message relating to rule that follows>")

; back into the PARSE dialect again, express whatever your rule is,
; and if it fails then we will have the above to use in error reporting

what: (ever your) [rule | {is}]

这基本上就是您需要做的。以下是电话号码的示例:

digit: charset "012345689"

phone-number-rule: [
here:
(error: "invalid area code")
["514" | "800" | "888" | "916" "877"]

here:
(error: "expecting dash")
"-"

here:
(error: "expecting 3 digits")
3 digit

here:
(error: "expecting dash")
"-"

here:
(error: "expecting 4 digits")
4 digit

(error: none)
]

然后您就可以看到它的实际效果。请注意,如果到达解析规则的末尾,我们将错误设置为无。如果还有更多输入需要处理,则 PARSE 将返回 false,因此,如果我们注意到没有设置错误,但 PARSE 无论如何都返回 false...我们失败了,因为有太多额外输入:

input: "800-22r2-3333"

if not parse input phone-number-rule [
if none? error [
error: "too much data for phone number"
]
]

either error [
column: length? copy/part input here newline
print rejoin ["error at position:" space column]
print error
print input
print rejoin [head insert/dup "" space column "^^"}
print newline
][
print {all good}
]

上面将打印以下内容:

error at position: 4

expecting 3 digits
800-22r2-3333
^

显然,您可以做更有效的事情,因为您在括号中放入的任何内容都将像正常的 Rebol 源代码一样进行评估。真的很灵活。我什至有解析器,可以在加载巨大数据集时更新进度条...:-)

关于parsing - Rebol 解析中匹配失败的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477164/

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