2019-07-29 19:21:36 +03:00
|
|
|
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
|
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
|
2019-10-13 16:37:43 +03:00
|
|
|
module compiler
|
2019-07-29 19:21:36 +03:00
|
|
|
|
2019-08-17 22:19:37 +03:00
|
|
|
import strings
|
2019-11-09 22:05:44 +03:00
|
|
|
import os
|
2019-07-29 19:21:36 +03:00
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-08-07 09:19:27 +03:00
|
|
|
fn (scanner mut Scanner) fgen(s_ string) {
|
2019-08-17 22:19:37 +03:00
|
|
|
mut s := s_
|
2019-07-29 19:21:36 +03:00
|
|
|
if scanner.fmt_line_empty {
|
|
|
|
s = strings.repeat(`\t`, scanner.fmt_indent) + s
|
|
|
|
}
|
|
|
|
scanner.fmt_out.write(s)
|
|
|
|
scanner.fmt_line_empty = false
|
|
|
|
}
|
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-08-07 09:19:27 +03:00
|
|
|
fn (scanner mut Scanner) fgenln(s_ string) {
|
2019-08-17 22:19:37 +03:00
|
|
|
mut s := s_
|
2019-07-29 19:21:36 +03:00
|
|
|
if scanner.fmt_line_empty {
|
|
|
|
s = strings.repeat(`\t`, scanner.fmt_indent) + s
|
|
|
|
}
|
|
|
|
scanner.fmt_out.writeln(s)
|
|
|
|
scanner.fmt_line_empty = true
|
|
|
|
}
|
|
|
|
|
2019-11-09 19:13:26 +03:00
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-07-29 19:21:36 +03:00
|
|
|
fn (p mut Parser) fgen(s string) {
|
2019-11-09 19:13:26 +03:00
|
|
|
if p.pass != .main {
|
|
|
|
return
|
|
|
|
}
|
2019-07-29 19:21:36 +03:00
|
|
|
p.scanner.fgen(s)
|
|
|
|
}
|
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-07-29 19:21:36 +03:00
|
|
|
fn (p mut Parser) fspace() {
|
2019-11-09 19:13:26 +03:00
|
|
|
if p.first_pass() {
|
|
|
|
return
|
|
|
|
}
|
2019-11-10 03:08:53 +03:00
|
|
|
p.fgen(' ')
|
2019-07-29 19:21:36 +03:00
|
|
|
}
|
|
|
|
|
2019-11-09 19:13:26 +03:00
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-07-29 19:21:36 +03:00
|
|
|
fn (p mut Parser) fgenln(s string) {
|
2019-11-09 19:13:26 +03:00
|
|
|
if p.pass != .main {
|
|
|
|
return
|
|
|
|
}
|
2019-07-29 19:21:36 +03:00
|
|
|
p.scanner.fgenln(s)
|
|
|
|
}
|
|
|
|
|
2019-09-27 04:00:48 +03:00
|
|
|
/*
|
2019-10-09 01:05:34 +03:00
|
|
|
fn (p mut Parser) peek() TokenKind {
|
2019-07-29 19:21:36 +03:00
|
|
|
for {
|
2019-08-04 12:00:56 +03:00
|
|
|
p.cgen.line = p.scanner.line_nr + 1
|
2019-07-29 19:21:36 +03:00
|
|
|
tok := p.scanner.peek()
|
|
|
|
if tok != .nl {
|
|
|
|
return tok
|
|
|
|
}
|
|
|
|
}
|
2019-08-08 10:49:56 +03:00
|
|
|
return .eof // TODO can never get here - v doesn't know that
|
2019-07-29 19:21:36 +03:00
|
|
|
}
|
2019-09-27 04:00:48 +03:00
|
|
|
*/
|
2019-07-29 19:21:36 +03:00
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-07-29 19:21:36 +03:00
|
|
|
fn (p mut Parser) fmt_inc() {
|
2019-11-09 19:13:26 +03:00
|
|
|
if p.pass != .main {
|
|
|
|
return
|
|
|
|
}
|
2019-07-29 19:21:36 +03:00
|
|
|
p.scanner.fmt_indent++
|
|
|
|
}
|
|
|
|
|
2019-10-27 12:16:33 +03:00
|
|
|
[if vfmt]
|
2019-07-29 19:21:36 +03:00
|
|
|
fn (p mut Parser) fmt_dec() {
|
2019-11-09 19:13:26 +03:00
|
|
|
if p.pass != .main {
|
|
|
|
return
|
|
|
|
}
|
2019-07-29 19:21:36 +03:00
|
|
|
p.scanner.fmt_indent--
|
|
|
|
}
|
|
|
|
|
2019-11-09 19:13:26 +03:00
|
|
|
[if vfmt]
|
|
|
|
fn (p mut Parser) fnext() {
|
|
|
|
if p.tok == .eof {
|
|
|
|
return
|
|
|
|
}
|
2019-11-10 03:08:53 +03:00
|
|
|
if p.tok == .rcbr && !p.inside_if_expr && p.prev_tok != .lcbr {
|
2019-11-09 19:13:26 +03:00
|
|
|
p.fmt_dec()
|
|
|
|
}
|
2019-11-10 03:08:53 +03:00
|
|
|
mut s := p.strtok()
|
|
|
|
// Need to reconstruct an interpolated string from multiple string and
|
|
|
|
// dollar tokens.
|
|
|
|
// 'abc $name zxc' => ['abc', $, name, 'zxc'] => 'abc'$name'zxc'
|
|
|
|
// need to remove the extra '
|
|
|
|
if p.tok == .str && p.peek() == .dollar {
|
|
|
|
s = s[..s.len - 1]
|
|
|
|
p.fmt_dollar = true
|
|
|
|
}
|
|
|
|
else if p.tok == .str && p.fmt_dollar {
|
|
|
|
s = s[1..]
|
|
|
|
p.fmt_dollar = false
|
|
|
|
}
|
|
|
|
p.fgen(s)
|
2019-11-09 19:13:26 +03:00
|
|
|
// vfmt: increase indentation on `{` unless it's `{}`
|
2019-11-10 03:08:53 +03:00
|
|
|
if p.tok == .lcbr && !p.inside_if_expr && p.peek() != .rcbr {
|
|
|
|
p.fgenln('')
|
2019-11-09 19:13:26 +03:00
|
|
|
p.fmt_inc()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-09 22:05:44 +03:00
|
|
|
[if vfmt]
|
|
|
|
fn (p mut Parser) gen_fmt() {
|
|
|
|
if p.pass != .main {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if p.file_name == '' {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
s := p.scanner.fmt_out.str().trim_space()
|
|
|
|
if s == '' {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
println('GENERATING ${p.file_name}.V')
|
|
|
|
out := os.create('/var/tmp/fmt/' + p.file_name) or {
|
|
|
|
verror('failed to create fmt.v')
|
|
|
|
return
|
|
|
|
}
|
|
|
|
//println(p.scanner.fmt_out.str())
|
|
|
|
out.writeln(p.scanner.fmt_out.str().trim_space())
|
|
|
|
out.close()
|
|
|
|
}
|
|
|
|
|