解析器 如何创建与“end”以外的任何字符串匹配的规则

Parser How to create a rule that matches any string apart from "end"

提问人:taat 提问时间:11/9/2023 更新时间:11/9/2023 访问量:42

问:

大家好,所以我正在写一个解析器,我遇到了我得到歧义的问题,因为我有 2 个规则导致歧义,一个与user_defined_types有关,另一个与record_names有关

所以让我分解一下

在我尝试解析的数据中,用户可以定义自己的类型,我正确地捕获了它,但是当我尝试在解析器中识别用户定义的类型时,我必须寻找 CNAME CNAME 形式,它在 lark 中被定义为

DIGIT: "0".."9"
LCASE_LETTER: "a".."z"
UCASE_LETTER: "A".."Z"

LETTER: UCASE_LETTER | LCASE_LETTER

CNAME: ("_"|LETTER) ("_"|LETTER|DIGIT)*

好的user_defined_type我的数据以 2 个单独的 CNAMES 的形式出现,所以举个例子 userDefinedType(用户定义类型) userDefinedTypeName

然后尝试在解析器中找到record_name,该规则的形式是

record_name: "end" CNAME 

由于记录名称是在记录末尾捕获的,因此当记录关闭并且名称跟随关键字“end”时,end 是我尝试解析的数据中的关键字

歧义的问题在于记录名称的示例 so => end myRecord

这也属于user_defined_type规则,也属于record_name规则,所以这就是我们得到 2 个独立树的地方,歧义我希望它只属于record_name规则,而不是user_defined_type规则

有没有办法修改CNAME来识别除“end”以外的所有字符串,或者有没有办法在我的user_defined_type中添加不同的正则表达式以检查第一个字符串是否不是= end

所以更改user_defined_type:NOT_END CNAME

谁能提出最好的做法以及如何编写一个与除 end 之外的所有字符串匹配的正则表达式

谢谢

正则表达式 解析 云雀

评论

0赞 MegaIng 11/9/2023
Lark 默认会正确处理此类歧义,并且更喜欢终端而不是与内容匹配。你能展示一个实际的语法示例来说明这个问题吗?endCNAMEend

答: 暂无答案