File: semwhitespace.jison

package info (click to toggle)
node-jison 0.4.17%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 348 kB
  • ctags: 57
  • sloc: yacc: 32; makefile: 16; sh: 3
file content (67 lines) | stat: -rw-r--r-- 1,037 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* Demonstrates use of semantic whitespace pseudo-tokens. */

%start prog

%ebnf

%options token-stack

%% /* language grammar */

prog
	: proglist ENDOFFILE
	{ console.log("AST: %j", $proglist); }
	;

proglist
	: proglist stmt
	{ $proglist.push($stmt); $$ = $proglist; }
	| stmt
	{ $$ = [$stmt]; }
	;

if_stmt
	: IF LPAREN expr RPAREN COLON stmt_block
	{ $$ = [ "if", $expr, $stmt_block ]; }
	| IF LPAREN expr RPAREN COLON stmt_block ELSE COLON stmt_block
	{ $$ = [ "if", $expr, $6, $9 ]; }
	;

print_stmt
	: PRINT STRING
	{ $$ = ["print", $2]; }
	;

stmt
	: if_stmt
	| print_stmt
	;

stmt_list
	: stmt
	{ $$ = ["stmt_list", $stmt]; }
	| stmt_list stmt
	{ $stmt_list.push($stmt); $$ = $stmt_list; }
	;

stmt_block
	: INDENT stmt_list DEDENT
	{ $$ = $stmt_list; }
	;

atom
	: ID
	{ $$ = ["id", $1]; }
	| NATLITERAL
	{ $$ = ["natlit", $1]; }
	| LPAREN expr RPAREN
	{ $$ = ["expr", $2]; }
	;

expr
	: atom
	| expr PLUS atom
	{ $expr.push(["plus", $atom]); $$ = $expr; }
	| expr MINUS atom
	{ $expr.push(["minus", $atom]); $$ = $expr; }
	;