1

I developed a Custom Language plugin based on this this tutorial.

My plugin parses key/value language files with format like below. Values can contain some HTML tags like <br>, <i>, <b>, <span> and \n. So I want to highlight these tags as separate PSI elements inside green PSI elements (values) (see pic). How can I overwrite my rules to get this?

#Section header

KEY1 = First<br>Value
KEY2 = Second\nValue

enter image description here

Bnf rules I use

lngFile ::= item_*

private item_ ::= (property|header|COMMENT|CRLF)

property ::= (KEY? SEPARATOR VALUE?) | KEY {
  mixin="someClass"
  implements="someClass"
  methods=[getKey getValue getName setName getNameIdentifier getPresentation]
}

header ::= HEADER {
  mixin="someClass"
  implements="someClass"
  methods=[getName setName getNameIdentifier getPresentation]
}

Flex

%%

%class LngLexer
%implements FlexLexer
%unicode
%function advance
%type IElementType
%eof{  return;
%eof}

CRLF=\R
WHITE_SPACE=[\ \n\t\f]
FIRST_VALUE_CHARACTER=[^ \n\f\\] | "\\"{CRLF} | "\\".
VALUE_CHARACTER=[^\n\f\\] | "\\"{CRLF} | "\\".
END_OF_LINE_COMMENT=("//")[^\r\n]*
HEADER=("#")[^\r\n]*
SEPARATOR=[:=]
KEY_CHARACTER=[^:=\ \n\t\f\\] | "\\ "

%state WAITING_VALUE

%%

<YYINITIAL> {END_OF_LINE_COMMENT}                           { yybegin(YYINITIAL); return LngTypes.COMMENT; }

<YYINITIAL> {HEADER}                                        { yybegin(YYINITIAL); return LngTypes.HEADER; }

<YYINITIAL> {KEY_CHARACTER}+                                { yybegin(YYINITIAL); return LngTypes.KEY; }

<YYINITIAL> {SEPARATOR}                                     { yybegin(WAITING_VALUE); return LngTypes.SEPARATOR; }

<WAITING_VALUE> {CRLF}({CRLF}|{WHITE_SPACE})+               { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; }

<WAITING_VALUE> {WHITE_SPACE}+                              { yybegin(WAITING_VALUE); return TokenType.WHITE_SPACE; }

<WAITING_VALUE> {FIRST_VALUE_CHARACTER}{VALUE_CHARACTER}*   { yybegin(YYINITIAL); return LngTypes.VALUE; }

({CRLF}|{WHITE_SPACE})+                                     { yybegin(YYINITIAL); return TokenType.WHITE_SPACE; }

[^]                                                         { return TokenType.BAD_CHARACTER; }
schmidt9
  • 4,436
  • 1
  • 26
  • 32

0 Answers0