85 lines
2.2 KiB
ANTLR
85 lines
2.2 KiB
ANTLR
grammar plsm;
|
|
|
|
module: MODULE identifier ';' moduleImport* moduleStmt*;
|
|
|
|
moduleImport: IMPORT importName ';';
|
|
importName: identifier ('/' identifier)*;
|
|
moduleStmt: let | fnDecl | fnDef | traitDef | typeDef;
|
|
|
|
traitDef: TRAIT identifier '=' identifier ';'
|
|
| TRAIT identifier '=' '{' (fnDecl)* '}' ';';
|
|
|
|
typeDef: TYPE identifier '=' type ';'
|
|
| TYPE identifier '=' ('(' fnDefArgs ')')? '{' (fnDecl | fnDef)* '}' ';';
|
|
|
|
fnDef: FN identifier '[' fnDefArgs? ']' type '=' expr ';';
|
|
fnDefArgs: identifier type (',' identifier type)*;
|
|
|
|
fnDecl: FN identifier '[' fnDeclArgs? ']' type ';';
|
|
fnDeclArgs: identifier? type (',' identifier? type)*;
|
|
|
|
let: LET identifier type? '=' expr ';';
|
|
|
|
exprStmt: expr ';';
|
|
|
|
type: type1; // novisit
|
|
type1: type0
|
|
| '(' type ')'
|
|
| '(' tupleTypeList ')' // tuple
|
|
| '[' typeList? ']' '->' type; // closure
|
|
type0: identifier
|
|
| identifier '{' typeList '}'; // generic
|
|
|
|
tupleTypeList: type (',' type)+;
|
|
typeList: type (',' type)*;
|
|
|
|
|
|
expr: expr3; // novisit
|
|
expr3: expr2
|
|
| '[' identifierList? ']' '->' expr // closure
|
|
| '{' blockStmt* (expr ';') '}';
|
|
expr2: expr1
|
|
| expr2 operator expr1; // binary expr
|
|
expr1: expr0
|
|
| operator expr0; // unary expr
|
|
expr0: literal
|
|
| identifier
|
|
| expr0 '[' exprList? ']' // fn call
|
|
| '(' expr ')'
|
|
| '(' tupleExprList ')' // tuple
|
|
| expr0 '.' identifier; // property accessor
|
|
|
|
blockStmt: let | exprStmt | fnDef;
|
|
tupleExprList: expr (',' expr)+;
|
|
exprList: expr (',' expr)*;
|
|
|
|
identifierList: identifier (',' identifier)*;
|
|
|
|
literal: NULL='null' | INT_LIT | FLOAT_LIT;
|
|
|
|
operator: '=' | '->'
|
|
| OPERATOR;
|
|
|
|
identifier: keyword | IDENTIFIER;
|
|
keyword: BINOP | FN | IMPORT | LET | MODULE | NATIVE | TRAIT | TYPE | UNOP;
|
|
|
|
|
|
INT_LIT: [0-9]+ | '0x' [0-9a-fA-F]+ | '0o' [0-7]+ | '0b' [01]+;
|
|
FLOAT_LIT: [0-9]+ '.' | [0-9]* '.' [0-9]+;
|
|
|
|
OPERATOR: ('+'|'-'|'*'|'/'|'%'|'!'|'&'|'$'|'§'|'|'|'='|'<'|'>'|'?'|'~'|'#'|':'|'^'|'\\'|'.')+;
|
|
|
|
BINOP: 'binop';
|
|
FN: 'fn';
|
|
IMPORT: 'import';
|
|
LET: 'let';
|
|
MODULE: 'module';
|
|
NATIVE: 'native';
|
|
TRAIT: 'trait';
|
|
TYPE: 'type';
|
|
UNOP: 'unop';
|
|
|
|
IDENTIFIER: [a-zA-Z_] [a-zA-Z0-9_]*;
|
|
|
|
WHITESPACE: [ \r\n\t]+ -> skip;
|