4

IntelliJ 用のカスタム言語プラグインを作成しています。

これは、言語の簡単な例です。構造が再帰的であることに注意してください。

ここに画像の説明を入力

FLEX ファイルと BNF ファイルを正常に実装しましたが、エラー リカバリを追加する方法がわかりません。RecoverWhileについて読み、Grammar-Kit の HOWTOにピン留めしましたが、それらを自分のシナリオに適用する方法がわかりません。

上記の茶色のアイテム(「aaa」、「ccc」など)を「アイテム」と呼びます。

黄色いもの (「bbb」、「ddd」、...) を「プロパティ」と呼びます。

各項目には、項目名(例: "aaa")、単一のプロパティ(例: "bbb") があり、他の項目を含めることができます (例: "aaa" には "ccc"、"eeee"、および "gg" が含まれます)。

現時点では、アイテムの形式が正しくない場合、プラグインは適切に動作しません。例えば:

ここに画像の説明を入力

この例では、"ccc" がプロパティのないアイテムの名前であることをパーサーに "理解" させたいと考えています (たとえば、閉じ括弧の前の改行を検出することによって)。

壊れた「ccc」項目が「eeee」の解析に影響を与えたくありません (ただし、テキストに存在する「ccc」の要素 (この場合は名前) を PSI ツリーに含めたいと思います)。

私が使用する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
4

1 に答える 1

0

私は最終的に次のように機能させることができました:

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

于 2016-10-28T09:57:09.187 に答える