Несбалансированное дерево. Скорее всего, вызвано несбалансированными маркерами

Я работаю над плагином IntelliJ, который добавит поддержку пользовательского языка. В настоящее время я все еще пытаюсь привыкнуть к грамматическому набору и как работает разработка плагинов.

С этой целью я начал работать с парсером для основных выражений:

(1.0 * 5 + (3.44 ^ -2))

Следуя документации, предоставленной JetBrains, я попытался написать грамматики BNF и JFlex для приведенного выше примера.

Сгенерированный код для этих грамматик компилируется, но при запуске плагина происходит сбой:

java.lang.Throwable: несбалансированное дерево. Скорее всего, вызвано несбалансированными маркерами. Попробуйте вызвать setDebugMode (true) для переданного PsiBuilder, чтобы определить точное местоположение проблемы.

Включение режима отладки выводит длинный список трасс:

java.lang.Throwable: Created at the following trace.
at com.intellij.lang.impl.MarkerOptionalData.notifyAllocated(MarkerOptionalData.java:83)
at com.intellij.lang.impl.PsiBuilderImpl.createMarker(PsiBuilderImpl.java:820)
at com.intellij.lang.impl.PsiBuilderImpl.precede(PsiBuilderImpl.java:457)
at com.intellij.lang.impl.PsiBuilderImpl.access$700(PsiBuilderImpl.java:51)
at com.intellij.lang.impl.PsiBuilderImpl$StartMarker.precede(PsiBuilderImpl.java:361)

java.lang.Throwable: Created at the following trace.
at com.intellij.lang.impl.MarkerOptionalData.notifyAllocated(MarkerOptionalData.java:83)
at com.intellij.lang.impl.PsiBuilderImpl.createMarker(PsiBuilderImpl.java:820)
at com.intellij.lang.impl.PsiBuilderImpl.mark(PsiBuilderImpl.java:810)
at com.intellij.lang.impl.PsiBuilderAdapter.mark(PsiBuilderAdapter.java:107)
at com.intellij.lang.parser.GeneratedParserUtilBase.enter_section_(GeneratedParserUtilBase.java:432)
at com.example.intellij.mylang.MyLangParser.exp_expr_0(MyLangParser.java:154)

java.lang.Throwable: Created at the following trace.
at com.intellij.lang.impl.MarkerOptionalData.notifyAllocated(MarkerOptionalData.java:83)
at com.intellij.lang.impl.PsiBuilderImpl.createMarker(PsiBuilderImpl.java:820)
at com.intellij.lang.impl.PsiBuilderImpl.precede(PsiBuilderImpl.java:457)
at com.intellij.lang.impl.PsiBuilderImpl.access$700(PsiBuilderImpl.java:51)
at com.intellij.lang.impl.PsiBuilderImpl$StartMarker.precede(PsiBuilderImpl.java:361)

Даже с этими журналами отладки я все еще не понимаю, что происходит не так. Я пытался погуглить, и я даже не могу понять, что означает "маркер" в этом контексте...

Вот грамматика БНФ:

root ::= expr *

expr ::= add_expr

left add_expr ::= add_op mod_expr | mod_expr
private add_op ::= '+'|'-'

left mod_expr ::= mod_op int_div_expr | int_div_expr
private mod_op ::= 'mod'

left int_div_expr ::= int_div_op mult_expr | mult_expr
private int_div_op ::= '\'

left mult_expr ::= mult_op unary_expr | unary_expr
private mult_op ::= '*'|'/'

unary_expr ::= '-' unary_expr | '+' unary_expr | exp_expr

left exp_expr ::= exp_op exp_expr | value
private exp_op ::= '^'

// TODO: Add support for left_expr. Example: "someVar.x"
value ::= const_expr | '(' expr ')'

const_expr ::= bool_literal | integer_literal | FLOAT_LITERAL | STRING_LITERAL | invalid

bool_literal ::= 'true' | 'false'

integer_literal ::= INT_LITERAL | HEX_LITERAL

1 ответ

Я разобрался в проблеме. Это не имело никакого отношения к моему БНФ. Проблема была в том, что в моем файле jflex я звонил yybegin(YYINITIAL) пока уже в YYINITIAL государство.

Другие вопросы по тегам