Skip to content

Instantly share code, notes, and snippets.

@theY4Kman
Created January 30, 2021 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theY4Kman/34ff8e3bb53e1354b0dd495ff07043b2 to your computer and use it in GitHub Desktop.
Save theY4Kman/34ff8e3bb53e1354b0dd495ff07043b2 to your computer and use it in GitHub Desktop.
{
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