2024-10-28 15:22:57 +01:00
|
|
|
/*
|
2024-10-30 16:43:33 +01:00
|
|
|
* This file is part of ZigBrains.
|
2024-10-28 15:22:57 +01:00
|
|
|
*
|
2024-10-30 16:43:33 +01:00
|
|
|
* Copyright (C) 2023-2024 FalsePattern
|
|
|
|
* All Rights Reserved
|
2024-10-28 15:22:57 +01:00
|
|
|
*
|
2024-10-30 16:43:33 +01:00
|
|
|
* The above copyright notice and this permission notice shall be included
|
|
|
|
* in all copies or substantial portions of the Software.
|
2024-10-28 15:22:57 +01:00
|
|
|
*
|
2024-10-30 16:43:33 +01:00
|
|
|
* ZigBrains is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
* the Free Software Foundation, only version 3 of the License.
|
|
|
|
*
|
|
|
|
* ZigBrains is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* along with ZigBrains. If not, see <https://www.gnu.org/licenses/>.
|
2024-10-28 15:22:57 +01:00
|
|
|
*/
|
|
|
|
package com.falsepattern.zigbrains.zig.lexer;
|
|
|
|
|
|
|
|
import com.intellij.lexer.FlexLexer;
|
|
|
|
import com.intellij.psi.tree.IElementType;
|
|
|
|
|
|
|
|
import static com.intellij.psi.TokenType.WHITE_SPACE;
|
|
|
|
import static com.intellij.psi.TokenType.BAD_CHARACTER;
|
|
|
|
import static com.falsepattern.zigbrains.zig.psi.ZigTypes.*;
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
%class ZigFlexLexer
|
|
|
|
%implements FlexLexer
|
|
|
|
%function advance
|
|
|
|
%type IElementType
|
|
|
|
|
|
|
|
CRLF=\R
|
|
|
|
WHITE_SPACE=[\s]+
|
|
|
|
|
|
|
|
bin=[01]
|
|
|
|
bin_="_"? {bin}
|
|
|
|
oct=[0-7]
|
|
|
|
oct_="_"? {oct}
|
|
|
|
hex=[0-9a-fA-F]
|
|
|
|
hex_="_"? {hex}
|
|
|
|
dec=[0-9]
|
|
|
|
dec_="_"? {dec}
|
|
|
|
|
|
|
|
bin_int={bin} {bin_}*
|
|
|
|
oct_int={oct} {oct_}*
|
|
|
|
dec_int={dec} {dec_}*
|
|
|
|
hex_int={hex} {hex_}*
|
|
|
|
|
2024-11-11 09:56:50 +01:00
|
|
|
char_char= \\ .
|
|
|
|
| [^\'\n]
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
string_char= \\ .
|
|
|
|
| [^\"\n]
|
|
|
|
|
|
|
|
all_nl_wrap=[^\n]* [ \n]*
|
2025-01-21 15:39:41 +01:00
|
|
|
all_no_nl=[^\n]+
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
FLOAT= "0x" {hex_int} "." {hex_int} ([pP] [-+]? {dec_int})?
|
|
|
|
| {dec_int} "." {dec_int} ([eE] [-+]? {dec_int})?
|
|
|
|
| "0x" {hex_int} [pP] [-+]? {dec_int}
|
|
|
|
| {dec_int} [eE] [-+]? {dec_int}
|
|
|
|
|
|
|
|
INTEGER= "0b" {bin_int}
|
|
|
|
| "0o" {oct_int}
|
|
|
|
| "0x" {hex_int}
|
|
|
|
| {dec_int}
|
|
|
|
|
|
|
|
IDENTIFIER_PLAIN=[A-Za-z_][A-Za-z0-9_]*
|
|
|
|
BUILTINIDENTIFIER="@"[A-Za-z_][A-Za-z0-9_]*
|
|
|
|
|
|
|
|
%state STR_LIT
|
|
|
|
%state STR_MULT_LINE
|
|
|
|
%state CHAR_LIT
|
|
|
|
|
|
|
|
%state ID_QUOT
|
2024-12-22 22:55:47 +01:00
|
|
|
%state UNT_SQUOT
|
|
|
|
%state UNT_DQUOT
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
%state CDOC_CMT
|
|
|
|
%state DOC_CMT
|
|
|
|
%state LINE_CMT
|
|
|
|
%%
|
|
|
|
|
|
|
|
//Comments
|
|
|
|
|
|
|
|
<YYINITIAL> "//!" { yybegin(CDOC_CMT); }
|
|
|
|
<CDOC_CMT> {all_nl_wrap} "//!" { }
|
2025-01-21 15:39:41 +01:00
|
|
|
<CDOC_CMT> {all_no_nl} { }
|
|
|
|
<CDOC_CMT> \n { yybegin(YYINITIAL); return CONTAINER_DOC_COMMENT; }
|
|
|
|
<CDOC_CMT> <<EOF>> { yybegin(YYINITIAL); return CONTAINER_DOC_COMMENT; }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> "///" { yybegin(DOC_CMT); }
|
|
|
|
<DOC_CMT> {all_nl_wrap} "///" { }
|
2025-01-21 15:39:41 +01:00
|
|
|
<DOC_CMT> {all_no_nl} { }
|
|
|
|
<DOC_CMT> \n { yybegin(YYINITIAL); return DOC_COMMENT; }
|
|
|
|
<DOC_CMT> <<EOF>> { yybegin(YYINITIAL); return DOC_COMMENT; }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> "//" { yybegin(LINE_CMT); }
|
|
|
|
<LINE_CMT> {all_nl_wrap} "//" { }
|
2025-01-21 15:39:41 +01:00
|
|
|
<LINE_CMT> {all_no_nl} { }
|
|
|
|
<LINE_CMT> \n { yybegin(YYINITIAL); return LINE_COMMENT; }
|
|
|
|
<LINE_CMT> <<EOF>> { yybegin(YYINITIAL); return LINE_COMMENT; }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
//Symbols
|
|
|
|
<YYINITIAL> "&" { return AMPERSAND; }
|
|
|
|
<YYINITIAL> "&=" { return AMPERSANDEQUAL; }
|
|
|
|
<YYINITIAL> "*" { return ASTERISK; }
|
|
|
|
<YYINITIAL> "**" { return ASTERISK2; }
|
|
|
|
<YYINITIAL> "*=" { return ASTERISKEQUAL; }
|
|
|
|
<YYINITIAL> "*%" { return ASTERISKPERCENT; }
|
|
|
|
<YYINITIAL> "*%=" { return ASTERISKPERCENTEQUAL; }
|
|
|
|
<YYINITIAL> "*|" { return ASTERISKPIPE; }
|
|
|
|
<YYINITIAL> "*|=" { return ASTERISKPIPEEQUAL; }
|
|
|
|
<YYINITIAL> "^" { return CARET; }
|
|
|
|
<YYINITIAL> "^=" { return CARETEQUAL; }
|
|
|
|
<YYINITIAL> ":" { return COLON; }
|
|
|
|
<YYINITIAL> "," { return COMMA; }
|
|
|
|
<YYINITIAL> "." { return DOT; }
|
|
|
|
<YYINITIAL> ".." { return DOT2; }
|
|
|
|
<YYINITIAL> "..." { return DOT3; }
|
|
|
|
<YYINITIAL> ".*" { return DOTASTERISK; }
|
|
|
|
<YYINITIAL> ".?" { return DOTQUESTIONMARK; }
|
|
|
|
<YYINITIAL> "=" { return EQUAL; }
|
|
|
|
<YYINITIAL> "==" { return EQUALEQUAL; }
|
|
|
|
<YYINITIAL> "=>" { return EQUALRARROW; }
|
|
|
|
<YYINITIAL> "!" { return EXCLAMATIONMARK; }
|
|
|
|
<YYINITIAL> "!=" { return EXCLAMATIONMARKEQUAL; }
|
|
|
|
<YYINITIAL> "<" { return LARROW; }
|
|
|
|
<YYINITIAL> "<<" { return LARROW2; }
|
|
|
|
<YYINITIAL> "<<=" { return LARROW2EQUAL; }
|
|
|
|
<YYINITIAL> "<<|" { return LARROW2PIPE; }
|
|
|
|
<YYINITIAL> "<<|=" { return LARROW2PIPEEQUAL; }
|
|
|
|
<YYINITIAL> "<=" { return LARROWEQUAL; }
|
|
|
|
<YYINITIAL> "{" { return LBRACE; }
|
|
|
|
<YYINITIAL> "[" { return LBRACKET; }
|
|
|
|
<YYINITIAL> "(" { return LPAREN; }
|
|
|
|
<YYINITIAL> "-" { return MINUS; }
|
|
|
|
<YYINITIAL> "-=" { return MINUSEQUAL; }
|
|
|
|
<YYINITIAL> "-%" { return MINUSPERCENT; }
|
|
|
|
<YYINITIAL> "-%=" { return MINUSPERCENTEQUAL; }
|
|
|
|
<YYINITIAL> "-|" { return MINUSPIPE; }
|
|
|
|
<YYINITIAL> "-|=" { return MINUSPIPEEQUAL; }
|
|
|
|
<YYINITIAL> "->" { return MINUSRARROW; }
|
|
|
|
<YYINITIAL> "%" { return PERCENT; }
|
|
|
|
<YYINITIAL> "%=" { return PERCENTEQUAL; }
|
|
|
|
<YYINITIAL> "|" { return PIPE; }
|
|
|
|
<YYINITIAL> "||" { return PIPE2; }
|
|
|
|
<YYINITIAL> "|=" { return PIPEEQUAL; }
|
|
|
|
<YYINITIAL> "+" { return PLUS; }
|
|
|
|
<YYINITIAL> "++" { return PLUS2; }
|
|
|
|
<YYINITIAL> "+=" { return PLUSEQUAL; }
|
|
|
|
<YYINITIAL> "+%" { return PLUSPERCENT; }
|
|
|
|
<YYINITIAL> "+%=" { return PLUSPERCENTEQUAL; }
|
|
|
|
<YYINITIAL> "+|" { return PLUSPIPE; }
|
|
|
|
<YYINITIAL> "+|=" { return PLUSPIPEEQUAL; }
|
|
|
|
//This one is directly in the tokenizer, because it conflicts with identifiers without context
|
|
|
|
//<YYINITIAL> "c" { return LETTERC; }
|
|
|
|
<YYINITIAL> "?" { return QUESTIONMARK; }
|
|
|
|
<YYINITIAL> ">" { return RARROW; }
|
|
|
|
<YYINITIAL> ">>" { return RARROW2; }
|
|
|
|
<YYINITIAL> ">>=" { return RARROW2EQUAL; }
|
|
|
|
<YYINITIAL> ">=" { return RARROWEQUAL; }
|
|
|
|
<YYINITIAL> "}" { return RBRACE; }
|
|
|
|
<YYINITIAL> "]" { return RBRACKET; }
|
|
|
|
<YYINITIAL> ")" { return RPAREN; }
|
|
|
|
<YYINITIAL> ";" { return SEMICOLON; }
|
|
|
|
<YYINITIAL> "/" { return SLASH; }
|
|
|
|
<YYINITIAL> "/=" { return SLASHEQUAL; }
|
|
|
|
<YYINITIAL> "~" { return TILDE; }
|
|
|
|
|
|
|
|
// keywords
|
|
|
|
<YYINITIAL> "addrspace" { return KEYWORD_ADDRSPACE; }
|
|
|
|
<YYINITIAL> "align" { return KEYWORD_ALIGN; }
|
|
|
|
<YYINITIAL> "allowzero" { return KEYWORD_ALLOWZERO; }
|
|
|
|
<YYINITIAL> "and" { return KEYWORD_AND; }
|
|
|
|
<YYINITIAL> "anyframe" { return KEYWORD_ANYFRAME; }
|
|
|
|
<YYINITIAL> "anytype" { return KEYWORD_ANYTYPE; }
|
|
|
|
<YYINITIAL> "asm" { return KEYWORD_ASM; }
|
|
|
|
<YYINITIAL> "async" { return KEYWORD_ASYNC; }
|
|
|
|
<YYINITIAL> "await" { return KEYWORD_AWAIT; }
|
|
|
|
<YYINITIAL> "break" { return KEYWORD_BREAK; }
|
|
|
|
<YYINITIAL> "callconv" { return KEYWORD_CALLCONV; }
|
|
|
|
<YYINITIAL> "catch" { return KEYWORD_CATCH; }
|
|
|
|
<YYINITIAL> "comptime" { return KEYWORD_COMPTIME; }
|
|
|
|
<YYINITIAL> "const" { return KEYWORD_CONST; }
|
|
|
|
<YYINITIAL> "continue" { return KEYWORD_CONTINUE; }
|
|
|
|
<YYINITIAL> "defer" { return KEYWORD_DEFER; }
|
|
|
|
<YYINITIAL> "else" { return KEYWORD_ELSE; }
|
|
|
|
<YYINITIAL> "enum" { return KEYWORD_ENUM; }
|
|
|
|
<YYINITIAL> "errdefer" { return KEYWORD_ERRDEFER; }
|
|
|
|
<YYINITIAL> "error" { return KEYWORD_ERROR; }
|
|
|
|
<YYINITIAL> "export" { return KEYWORD_EXPORT; }
|
|
|
|
<YYINITIAL> "extern" { return KEYWORD_EXTERN; }
|
|
|
|
<YYINITIAL> "fn" { return KEYWORD_FN; }
|
|
|
|
<YYINITIAL> "for" { return KEYWORD_FOR; }
|
|
|
|
<YYINITIAL> "if" { return KEYWORD_IF; }
|
|
|
|
<YYINITIAL> "inline" { return KEYWORD_INLINE; }
|
|
|
|
<YYINITIAL> "noalias" { return KEYWORD_NOALIAS; }
|
|
|
|
<YYINITIAL> "nosuspend" { return KEYWORD_NOSUSPEND; }
|
|
|
|
<YYINITIAL> "noinline" { return KEYWORD_NOINLINE; }
|
|
|
|
<YYINITIAL> "opaque" { return KEYWORD_OPAQUE; }
|
|
|
|
<YYINITIAL> "or" { return KEYWORD_OR; }
|
|
|
|
<YYINITIAL> "orelse" { return KEYWORD_ORELSE; }
|
|
|
|
<YYINITIAL> "packed" { return KEYWORD_PACKED; }
|
|
|
|
<YYINITIAL> "pub" { return KEYWORD_PUB; }
|
|
|
|
<YYINITIAL> "resume" { return KEYWORD_RESUME; }
|
|
|
|
<YYINITIAL> "return" { return KEYWORD_RETURN; }
|
|
|
|
<YYINITIAL> "linksection" { return KEYWORD_LINKSECTION; }
|
|
|
|
<YYINITIAL> "struct" { return KEYWORD_STRUCT; }
|
|
|
|
<YYINITIAL> "suspend" { return KEYWORD_SUSPEND; }
|
|
|
|
<YYINITIAL> "switch" { return KEYWORD_SWITCH; }
|
|
|
|
<YYINITIAL> "test" { return KEYWORD_TEST; }
|
|
|
|
<YYINITIAL> "threadlocal" { return KEYWORD_THREADLOCAL; }
|
|
|
|
<YYINITIAL> "try" { return KEYWORD_TRY; }
|
|
|
|
<YYINITIAL> "union" { return KEYWORD_UNION; }
|
|
|
|
<YYINITIAL> "unreachable" { return KEYWORD_UNREACHABLE; }
|
|
|
|
<YYINITIAL> "usingnamespace" { return KEYWORD_USINGNAMESPACE; }
|
|
|
|
<YYINITIAL> "var" { return KEYWORD_VAR; }
|
|
|
|
<YYINITIAL> "volatile" { return KEYWORD_VOLATILE; }
|
|
|
|
<YYINITIAL> "while" { return KEYWORD_WHILE; }
|
|
|
|
|
|
|
|
<YYINITIAL> "'" { yybegin(CHAR_LIT); }
|
2024-11-11 09:56:50 +01:00
|
|
|
<CHAR_LIT> {char_char}*"'" { yybegin(YYINITIAL); return CHAR_LITERAL; }
|
2024-12-24 12:48:34 +01:00
|
|
|
<CHAR_LIT> <<EOF>> { yybegin(YYINITIAL); return BAD_SQUOT; }
|
2024-12-22 22:55:47 +01:00
|
|
|
<CHAR_LIT> [^] { yypushback(1); yybegin(UNT_SQUOT); }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> {FLOAT} { return FLOAT; }
|
|
|
|
<YYINITIAL> {INTEGER} { return INTEGER; }
|
|
|
|
|
|
|
|
<YYINITIAL> "\"" { yybegin(STR_LIT); }
|
|
|
|
<STR_LIT> {string_char}*"\"" { yybegin(YYINITIAL); return STRING_LITERAL_SINGLE; }
|
2024-12-24 12:48:34 +01:00
|
|
|
<STR_LIT> <<EOF>> { yybegin(YYINITIAL); return BAD_DQUOT; }
|
2024-12-22 22:55:47 +01:00
|
|
|
<STR_LIT> [^] { yypushback(1); yybegin(UNT_DQUOT); }
|
2024-10-28 15:22:57 +01:00
|
|
|
<YYINITIAL> "\\\\" { yybegin(STR_MULT_LINE); }
|
|
|
|
<STR_MULT_LINE> {all_nl_wrap} "\\\\" { }
|
2025-01-21 15:39:41 +01:00
|
|
|
<STR_MULT_LINE> {all_no_nl} { }
|
|
|
|
<STR_MULT_LINE> \n { yybegin(YYINITIAL); return STRING_LITERAL_MULTI; }
|
|
|
|
<STR_MULT_LINE> <<EOF>> { yybegin(YYINITIAL); return STRING_LITERAL_MULTI; }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> {IDENTIFIER_PLAIN} { return IDENTIFIER; }
|
|
|
|
<YYINITIAL> "@\"" { yybegin(ID_QUOT); }
|
|
|
|
<ID_QUOT> {string_char}*"\"" { yybegin(YYINITIAL); return IDENTIFIER; }
|
2024-12-24 12:48:34 +01:00
|
|
|
<ID_QUOT> <<EOF>> { yybegin(YYINITIAL); return BAD_DQUOT; }
|
2024-12-22 22:55:47 +01:00
|
|
|
<ID_QUOT> [^] { yypushback(1); yybegin(UNT_DQUOT); }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> {BUILTINIDENTIFIER} { return BUILTINIDENTIFIER; }
|
|
|
|
|
2024-12-24 12:48:34 +01:00
|
|
|
<UNT_SQUOT> <<EOF>> { yybegin(YYINITIAL); return BAD_SQUOT; }
|
|
|
|
<UNT_SQUOT> {CRLF} { yybegin(YYINITIAL); return BAD_SQUOT; }
|
2025-01-21 15:39:41 +01:00
|
|
|
<UNT_SQUOT> {all_no_nl} { }
|
2024-12-24 12:48:34 +01:00
|
|
|
<UNT_DQUOT> <<EOF>> { yybegin(YYINITIAL); return BAD_DQUOT; }
|
|
|
|
<UNT_DQUOT> {CRLF} { yybegin(YYINITIAL); return BAD_DQUOT; }
|
2025-01-21 15:39:41 +01:00
|
|
|
<UNT_DQUOT> {all_no_nl} { }
|
2024-10-28 15:22:57 +01:00
|
|
|
|
|
|
|
<YYINITIAL> {WHITE_SPACE} { return WHITE_SPACE; }
|
|
|
|
|
|
|
|
[^] { return BAD_CHARACTER; }
|