aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/ast
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-08-28 15:59:22 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-09-02 13:06:53 +0200
commita7206b24cac96c08aecf2f3b4cc3c2e555eec708 (patch)
tree80c678141148ce2eafaab5617f168bd840b8c8a6 /pkg/ast
parentaa51461a34f998908d10f551615ad242bdff8fe9 (diff)
pkg/compiler: check and generate types
Move most of the logic from sysgen to pkg/compiler. Update #217
Diffstat (limited to 'pkg/ast')
-rw-r--r--pkg/ast/parser.go4
-rw-r--r--pkg/ast/scanner.go16
2 files changed, 10 insertions, 10 deletions
diff --git a/pkg/ast/parser.go b/pkg/ast/parser.go
index fd7b9ad4f..214be7fb9 100644
--- a/pkg/ast/parser.go
+++ b/pkg/ast/parser.go
@@ -96,10 +96,10 @@ func (p *parser) parseTopRecover() Node {
case nil:
case skipLine:
// Try to recover by consuming everything until next NEWLINE.
- for p.tok != tokNewLine {
+ for p.tok != tokNewLine && p.tok != tokEOF {
p.next()
}
- p.consume(tokNewLine)
+ p.tryConsume(tokNewLine)
default:
panic(err)
}
diff --git a/pkg/ast/scanner.go b/pkg/ast/scanner.go
index f1573350b..6dab16183 100644
--- a/pkg/ast/scanner.go
+++ b/pkg/ast/scanner.go
@@ -134,19 +134,19 @@ func (s *scanner) Scan() (tok token, lit string, pos Pos) {
s.next()
case s.ch == '`':
tok = tokCExpr
- for s.next(); s.ch != '`'; s.next() {
- if s.ch == 0 || s.ch == '\n' {
- s.Error(pos, "C expression is not terminated")
- break
- }
+ for s.next(); s.ch != '`' && s.ch != '\n'; s.next() {
+ }
+ if s.ch == '\n' {
+ s.Error(pos, "C expression is not terminated")
+ } else {
+ lit = string(s.data[pos.Off+1 : s.off])
+ s.next()
}
- lit = string(s.data[pos.Off+1 : s.off])
- s.next()
case s.prev2 == tokDefine && s.prev1 == tokIdent:
// Note: the old form for C expressions, not really lexable.
// TODO(dvyukov): get rid of this eventually.
tok = tokCExpr
- for s.next(); s.ch != '\n'; s.next() {
+ for ; s.ch != '\n'; s.next() {
}
lit = string(s.data[pos.Off:s.off])
case s.ch == '#':