Created
January 30, 2021 19:06
-
-
Save theY4Kman/34ff8e3bb53e1354b0dd495ff07043b2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
parserClass="org.idea_sp.parser.SourcePawnParser" | |
extends="com.intellij.extapi.psi.ASTWrapperPsiElement" | |
psiClassPrefix="SourcePawn" | |
psiImplClassSuffix="Impl" | |
psiPackage="org.idea_sp.psi" | |
psiImplPackage="org.idea_sp.psi.impl" | |
elementTypeHolderClass="org.idea_sp.psi.SourcePawnTypes" | |
elementTypeClass="org.idea_sp.psi.SourcePawnElementType" | |
tokenTypeClass="org.idea_sp.psi.SourcePawnTokenType" | |
tokens = [ | |
EQ="=" | |
EXCL="!" | |
TILDE="~" | |
QUEST="?" | |
COLON=":" | |
PLUS="+" | |
MINUS="-" | |
ASTERISK="*" | |
DIV="/" | |
OR="|" | |
XOR="^" | |
PERC="%" | |
LPAREN="(" | |
RPAREN=")" | |
LBRACE="{" | |
RBRACE="}" | |
LBRACKET="[" | |
RBRACKET="]" | |
SEMICOLON=";" | |
COMMA="," | |
ELLIPSIS="..." | |
DOT="." | |
EQEQ="==" | |
NE="!=" | |
OROR="||" | |
PLUSPLUS="++" | |
MINUSMINUS="--" | |
LT="<" | |
LE="<=" | |
LTLT="<<" | |
GT=">" | |
AND="&" | |
ANDAND="&&" | |
PLUSEQ="+=" | |
MINUSEQ="-=" | |
ASTERISKEQ="*=" | |
DIVEQ="/=" | |
ANDEQ="&=" | |
OREQ="|=" | |
XOREQ="^=" | |
PERCEQ="%=" | |
LTLTEQ="<<=" | |
GTGTEQ=">>=" | |
ASSERT_KEYWORD="assert" | |
BREAK_KEYWORD="break" | |
CASE_KEYWORD="case" | |
CONTINUE_KEYWORD="continue" | |
DEFAULT_KEYWORD="default" | |
DO_KEYWORD="do" | |
ELSE_KEYWORD="else" | |
EXIT_KEYWORD="exit" | |
FOR_KEYWORD="for" | |
GOTO_KEYWORD="goto" | |
IF_KEYWORD="if" | |
RETURN_KEYWORD="return" | |
SLEEP_KEYWORD="sleep" | |
STATE_KEYWORD="state" | |
SWITCH_KEYWORD="switch" | |
WHILE_KEYWORD="while" | |
DEFINED_KEYWORD="defined" | |
SIZEOF_KEYWORD="sizeof" | |
STATE_KEYWORD="state" | |
TAGOF_KEYWORD="tagof" | |
CONST_KEYWORD="const" | |
FORWARD_KEYWORD="forward" | |
NATIVE_KEYWORD="native" | |
NEW_KEYWORD="new" | |
OPERATOR_KEYWORD="operator" | |
PUBLIC_KEYWORD="public" | |
STATIC_KEYWORD="static" | |
STOCK_KEYWORD="stock" | |
DECL_KEYWORD="decl" | |
NEW_KEYWORD="new" | |
PUBLIC_KEYWORD="public" | |
// SourcePawn-specific keywords | |
ENUM_KEYWORD="enum" | |
STRUCT_KEYWORD="struct" | |
// TODO: remove me (for live preview purposes only) | |
SPACE="regexp:[\ \n\r\t\f]" | |
line_comment="regexp://[^\r\n]*" | |
block_comment="regexp:/\*(.|\n)*?\*/" | |
preprocessor_comment="regexp:#(assert|define|else|elseif|endif|endinput|error|file|if|include|line|pragma|section|tryinclude|undef)[^\r\n]*" | |
integer_literal="regexp:[-+]?\d[_\d]*" | |
float_literal="regexp:[-+]?\d[_\d]*\.\d[_\d]*(e[-+]?\d+)?" | |
hex_literal="regexp:[-+]?0x[a-fA-F0-9_]+" | |
binary_literal="regexp:[-+]?0b[01_]+" | |
string_literal="regexp:\"(\\.|[^\"])*\"" | |
character_literal="regexp:'(\\.|[^\"])'" | |
// @ and _ are not themselves valid identifiers. | |
identifier="regexp:([@_a-zA-Z][@_a-zA-Z0-9]+|[a-zA-Z][@_a-zA-Z0-9]*)" | |
// xxx/////////////// | |
// Below is from an attempt to use dvander's grammar as a base | |
// See https://wiki.alliedmods.net/SourcePawn_Transitional_Syntax#Grammar | |
// This is dvander's symbol. It doesn't handle all the edge cases Pawn allows | |
// symbol="regexp:[A-Za-z_]([A-Za-z0-9_@]*)" | |
symbol="regexp:([@_a-zA-Z][@_a-zA-Z0-9]+|[a-zA-Z][@_a-zA-Z0-9]*)" | |
] | |
} | |
root ::= root_item * | |
private root_item ::= (func | global_assn | global) ';' | |
global_assn ::= global '=' literal | |
global ::= global_new | global_old | |
private global_new ::= storage_class* type_expr symbol old_dims? | |
private global_old ::= storage_class* tag? symbol old_dims? | |
func ::= global func_arglist func_body | |
func_arglist ::= '(' (argdecl (',' argdecl)*)? ')' | |
func_body ::= '{' (stmt ';')* '}' | |
stmt ::= vardecl | local_assn | method_call | |
local_assn ::= (vardecl | symbol) '=' value_expr | |
value_expr ::= literal | method_call | symbol | '(' value_expr ')' | |
method_call ::= (func_qn | SIZEOF_KEYsWORD) '(' (value_expr (',' value_expr)*)? ')' {pin=2} | |
func_qn ::= symbol ('.' symbol)? | |
if_stmt ::= 'if' | |
return_type ::= return_new | return_old | |
return_new ::= type_expr new_dims? // Note, dims not yet supported. | |
return_old ::= old_dims? label? | |
argdecl ::= arg_new | arg_old | |
arg_new ::= "const"? type_expr '&'? symbol old_dims? ('=' arg_init)? | |
arg_old ::= "const"? tags? '&'? symbol old_dims? ('=' arg_init)? | |
arg_init ::= literal | symbol | |
vardecl ::= var_old | var_new | |
var_new ::= var_new_prefix? type_expr symbol old_dims? | |
var_new_prefix ::= "static" | "const" | |
var_old ::= var_old_prefix tag? symbol old_dims? | |
var_old_prefix ::= "new" | "decl" | "static" | "const" | |
storage_class ::= "public" | "static" | "const" | "stock" | |
type_expr ::= (builtin_type | symbol) new_dims? | |
builtin_type ::= "void" | |
| "int" | |
| "float" | |
| "char" | |
| "bool" | |
tags ::= tag_vector | tag | |
tag_vector ::= '{' symbol (',' symbol)* '}' ':' | |
tag ::= label | |
new_dims ::= ('[' ']')* | |
old_dims ::= ('[' dim_value_expr? ']')+ | |
dim_value_expr ::= number | method_call | |
label ::= symbol ':' | |
literal ::= number | string_literal | character_literal | 'null' | struct_literal | |
number ::= integer_literal | hex_literal | float_literal | |
struct_literal ::= '{' struct_item (',' struct_item)* '}' | |
struct_item ::= symbol '=' struct_expr | |
struct_expr ::= number | string_literal | character_literal | symbol |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment