Skip to content

Commit

Permalink
Cleanup for manual parser impl
Browse files Browse the repository at this point in the history
  • Loading branch information
ivanjermakov committed Jun 7, 2023
1 parent 1051c25 commit 2fe56f6
Show file tree
Hide file tree
Showing 12 changed files with 223 additions and 1,143 deletions.
70 changes: 70 additions & 0 deletions nois.bnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
module ::= statement*
;
statement ::= variable-def | type-def | return-stmt | expr
;
variable-def ::= LET-KEYWORD IDENTIFIER EQUALS expr
;
type-def ::= TYPE-KEYWORD IDENTIFIER TODO
;
return-stmt ::= RETURN-KEYWORD expr?
;
expr ::= sub-expr (infix-op sub-expr)*
;
sub-expr ::= prefix-op operand
| operand postfix-op?
;
operand ::= if-expr
| fn-expr
| O-PAREN expr C-PAREN
| STRING
| CHAR
| NUMBER
| IDENTIFIER
| type
;
infix-op ::= add-op | sub-op | mul-op | div-op | exp-op | mod-op | access-op | eq-op | ne-op
| ge-op | le-op | gt-op | lt-op | and-op | or-op;
add-op ::= PLUS;
sub-op ::= MINUS;
mul-op ::= ASTERISK;
div-op ::= SLASH;
exp-op ::= CARET;
mod-op ::= PERCENT;
access-op ::= PERIOD;
eq-op ::= EQUALS EQUALS;
ne-op ::= EXCL EQUALS;
ge-op ::= GREATER-EQ;
le-op ::= LESS-EQ;
gt-op ::= C-ANGLE;
lt-op ::= O-ANGLE;
and-op ::= AMPERSAND AMPERSAND;
or-op ::= PIPE PIPE;

prefix-op ::= add-op | sub-op | not-op | spread-op
;
not-op ::= EXCL
;
spread-op ::= PERIOD PERIOD
;

postfix-op ::= call-op
;
call-op ::= O-PAREN args C-PAREN
;
args ::= expr (COMMA expr)* COMMA?
;
fn-expr ::= O-PAREN params C-PAREN COLON type block
;
params ::= param (COMMA param)* COMMA?
;
param ::= IDENTIFIER COLON type
;
block ::= O-BRACE statement* C-BRACE
| O-BRACE C-BRACE
;
type ::= IDENTIFIER (O-ANGLE type-params C-ANGLE)?
;
type-params ::= type (COMMA type)* COMMA?
;
if-expr ::= IF-KEYWORD expr block (ELSE-KEYWORD block)?
;
10 changes: 5 additions & 5 deletions src/error.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { TokenName } from './parser/parser'
import { TokenKind } from './parser/parser'
import { indexToLocation, LocationRange, prettyIndex, prettyLocation } from './location'
import { Source } from './source'
import { LexerToken } from './lexer/lexer'
import { Token } from './lexer/lexer'

export interface SyntaxErrorInfo {
expected: TokenName[],
got: TokenName,
expected: TokenKind[],
got: TokenKind,
location: LocationRange
}

export const prettyLexerError = (token: LexerToken): string => {
export const prettyLexerError = (token: Token): string => {
return `lexer error: unknown token \`${token.value}\``
}

Expand Down
111 changes: 0 additions & 111 deletions src/grammar.bnf
Original file line number Diff line number Diff line change
@@ -1,111 +0,0 @@
program ::= statements_
;

statements_ ::= statement statements_
| E
;

statement ::= variable-def | type-def | return-stmt | expr
;

variable-def ::= LET-KEYWORD_ IDENTIFIER EQUALS_ expr
;

type-def ::= TYPE-KEYWORD_ IDENTIFIER TODO
;

return-stmt ::= RETURN-KEYWORD_ expr
| RETURN-KEYWORD_
;

expr ::= expr_
;

expr_ ::= expr__ infix-operator expr_
| expr__
;

expr__ ::= prefix-op operand
| operand postfix-op
| operand
;

operand ::= if-expr
| function-expr
| OPEN-PAREN_ expr CLOSE-PAREN_
| STRING
| CHAR
| NUMBER
| IDENTIFIER
| type
;

infix-operator ::= GREATER-EQ | LESS-EQ | PLUS | MINUS | ASTERISK | SLASH | CARET | PERCENT | PERIOD | EQUALS-OP
| NOT-EQUALS-OP | greater | less | AND | OR
;

greater ::= CLOSE-CHEVRON_
;

less ::= OPEN-CHEVRON_
;

prefix-op ::= PLUS | MINUS | EXCL | SPREAD
;

postfix-op ::= call-op
;

call-op ::= OPEN-PAREN_ args CLOSE-PAREN_
;

args ::= args_
;

args_ ::= expr COMMA_ args_
| expr trailing-comma_
| E
;

function-expr ::= OPEN-PAREN_ params CLOSE-PAREN_ COLON_ type block
;

block ::= OPEN-BRACE_ statements_ CLOSE-BRACE_
| OPEN-BRACE_ CLOSE-BRACE_
;

params ::= params_
;

params_ ::= param COMMA_ params_
| param trailing-comma_
| param
| E
;

param ::= IDENTIFIER COLON_ type
;

trailing-comma_ ::= COMMA_
| E
;

type ::= IDENTIFIER OPEN-CHEVRON_ type-params CLOSE-CHEVRON_
| IDENTIFIER
;

type-params ::= type-params_
| E
;

type-params_ ::= type COMMA_ type-params_
| type trailing-comma_
| E
;

if-expr ::= IF-KEYWORD_ expr block else-expr_
;

else-expr_ ::= ELSE-KEYWORD_ block
| E
;
Loading

0 comments on commit 2fe56f6

Please sign in to comment.