gpt4 book ai didi

parsing - IntelliJ : Grammar-Kit/BNF: how to recover from errors?

转载 作者:行者123 更新时间:2023-12-03 21:35:39 47 4
gpt4 key购买 nike

我正在为 IntelliJ 编写自定义语言插件。

这是该语言的简化示例。请注意,该结构是递归的:

enter image description here

我已经成功实现了 FLEX 和 BNF 文件,但我不确定如何添加错误恢复。我在 Grammar-Kit 的 HOWTO 中阅读了有关 RecoverWhile 和 pin 的内容,但我不确定如何将它们应用于我的场景。

我称上面的棕色元素(“aaa”、“ccc”等)为“元素”。

我称黄色的(“bbb”、“ddd”、...)为“属性”。

每个项目都有一个项目名称(例如“aaa”)、一个属性(例如“bbb”),并且可以包含其他项目(例如“aaa”包含“ccc”、“eeee”和“gg”)。

目前,当项目格式错误时,该插件表现不佳。例如:

enter image description here

在此示例中,我希望解析器“理解”“ccc”是缺少属性的项目的名称(例如,通过检测右括号前的换行符)。

我不希望损坏的“ccc”项目影响“eeee”的解析(但我确实希望 PSI 树具有文本中存在的“ccc”元素,在这种情况下 - 它的名称)。

这是我使用的 FLEX 和 BNF:

柔性:

CRLF= \n|\r|\r\n
WS=[\ \t\f]
WORD=[a-zA-Z0-9_#\-]+

%state EOF

%%
<YYINITIAL> {WORD} { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_WORD; }
<YYINITIAL> \[ { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_OPEN_SQUARE_BRACKET; }
<YYINITIAL> \] { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_CLOSE_SQUARE_BRACKET; }
<YYINITIAL> \{ { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_OPEN_CURLY_BRACKET; }
<YYINITIAL> \} { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_CLOSE_CURLY_BRACKET; }
({CRLF}|{WS})+ { return TokenType.WHITE_SPACE; }
{WS}+ { return TokenType.WHITE_SPACE; }
. { return TokenType.BAD_CHARACTER; }

BNF:
myLangFile ::= (item|COMMENT|CRLF)
item ::=
itemName
(TYPE_FLEX_OPEN_SQUARE_BRACKET itemProperty? TYPE_FLEX_CLOSE_SQUARE_BRACKET?)?
itemBody?
itemName ::= TYPE_FLEX_WORD
itemProperty ::= TYPE_FLEX_WORD
itemBody ::= TYPE_FLEX_OPEN_CURLY_BRACKET item* TYPE_FLEX_CLOSE_CURLY_BRACKET

最佳答案

我最终能够让它像这样工作:

myLangFile ::= (item|COMMENT|CRLF)
item ::=
itemName
itemProperties
itemBody?
itemName ::= TYPE_FLEX_WORD
itemProperties ::= TYPE_FLEX_OPEN_SQUARE_BRACKET [!TYPE_FLEX_CLOSE_SQUARE_BRACKET itemProperty ((TYPE_FLEX_SEMICOLON itemProperty)|itemProperty)*] TYPE_FLEX_CLOSE_SQUARE_BRACKET {
pin(".*") = 1
}
itemProperty ::= TYPE_FLEX_WORD TYPE_FLEX_EQUALS? itemPropertyValue? (TYPE_FLEX_EQUALS prv_swallowNextPropertyToPreventSyntaxErrors)?
private prv_swallowNextPropertyToPreventSyntaxErrors ::= TYPE_FLEX_WORD
itemPropertyValue ::= TYPE_FLEX_WORD
itemBody ::= TYPE_FLEX_OPEN_CURLY_BRACKET item* TYPE_FLEX_CLOSE_CURLY_BRACKET

它并不完美;例如,它允许用空格(而不仅仅是用分号)分隔项目属性,但它似乎确实解决了更重要的问题。

这可能也很有趣: https://github.com/JetBrains/Grammar-Kit/blob/master/resources/messages/attributeDescriptions/recoverWhile.html

关于parsing - IntelliJ : Grammar-Kit/BNF: how to recover from errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820437/

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