From 798a774484d6703bc94d3cfd9103e4cc5165dfa8 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 6 Jun 2018 02:33:41 +0200 Subject: .... --- calc.go | 74 +++++++++++++++++++++++++++++----------------------------------- calc.y | 6 +++--- lexer.go | 7 +++--- main.go | 6 ++++-- 4 files changed, 45 insertions(+), 48 deletions(-) diff --git a/calc.go b/calc.go index b1f2f67..3ac4c3c 100644 --- a/calc.go +++ b/calc.go @@ -51,10 +51,10 @@ const yyInitialStackSize = 16 //line calc.y:59 -func Parse(input string) (float64, bool) { +func Parse(input string) (float64, bool, error) { l := lex(input) yyParse(l) - return l.result, l.ok + return l.result, l.ok, l.err } //line yacctab:1 @@ -69,22 +69,22 @@ var yyExca = [...]int{ const yyPrivate = 57344 -const yyLast = 58 +const yyLast = 56 var yyAct = [...]int{ - 2, 10, 11, 12, 13, 14, 15, 17, 19, 20, - 16, 21, 22, 23, 24, 25, 26, 27, 10, 11, - 12, 13, 14, 15, 15, 9, 1, 4, 18, 29, - 6, 9, 0, 4, 3, 0, 6, 5, 7, 0, - 8, 0, 0, 5, 7, 0, 8, 10, 11, 12, - 13, 14, 15, 12, 13, 14, 15, 28, + 2, 10, 11, 12, 13, 14, 15, 16, 17, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 10, 11, + 12, 13, 14, 15, 15, 4, 1, 5, 3, 29, + 7, 10, 11, 12, 13, 14, 15, 6, 8, 0, + 9, 28, 5, 18, 0, 7, 0, 12, 13, 14, + 15, 0, 6, 8, 0, 9, } var yyPact = [...]int{ - 29, -1000, -5, -3, -1000, -1000, 23, 23, 23, -1000, - 23, 23, 23, 23, 23, 23, 23, -1000, -1000, 41, - 12, 45, 45, 13, 13, 13, -1000, -5, -1000, -1000, + 23, -1000, -5, -6, -1000, -1000, -1000, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, -1000, -1000, 25, + 12, 39, 39, 13, 13, 13, -1000, -5, -1000, -1000, } var yyPgo = [...]int{ @@ -92,25 +92,25 @@ var yyPgo = [...]int{ } var yyR1 = [...]int{ - 0, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, } var yyR2 = [...]int{ - 0, 0, 1, 3, 1, 1, 1, 3, 3, 3, - 3, 3, 3, 2, 3, 3, 1, + 0, 0, 1, 3, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 2, 3, 3, } var yyChk = [...]int{ - -1000, -2, -1, 5, 4, 14, 7, 15, 17, 2, + -1000, -2, -1, 5, 2, 4, 14, 7, 15, 17, 6, 7, 8, 9, 10, 11, 13, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 17, } var yyDef = [...]int{ - -2, -2, 2, 5, 4, 6, 0, 0, 0, 16, - 0, 0, 0, 0, 0, 0, 0, 13, 5, 0, - 0, 7, 8, 9, 10, 11, 12, 3, 14, 15, + -2, -2, 2, 6, 4, 5, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, 6, 0, + 0, 8, 9, 10, 11, 12, 13, 3, 15, 16, } var yyTok1 = [...]int{ @@ -487,77 +487,71 @@ yydefault: { reg[yyDollar[1].sval] = yyDollar[3].fval } - case 5: - yyDollar = yyS[yypt-1 : yypt+1] - //line calc.y:45 - { - yyVAL.fval = reg[yyDollar[1].sval] - } case 6: yyDollar = yyS[yypt-1 : yypt+1] //line calc.y:46 { - yyVAL.fval = reg[last] + yyVAL.fval = reg[yyDollar[1].sval] } case 7: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line calc.y:47 { - yyVAL.fval = yyDollar[1].fval + yyDollar[3].fval + yyVAL.fval = reg[last] } case 8: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:48 { - yyVAL.fval = yyDollar[1].fval - yyDollar[3].fval + yyVAL.fval = yyDollar[1].fval + yyDollar[3].fval } case 9: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:49 { - yyVAL.fval = yyDollar[1].fval * yyDollar[3].fval + yyVAL.fval = yyDollar[1].fval - yyDollar[3].fval } case 10: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:50 { - yyVAL.fval = yyDollar[1].fval / yyDollar[3].fval + yyVAL.fval = yyDollar[1].fval * yyDollar[3].fval } case 11: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:51 { - yyVAL.fval = math.Mod(yyDollar[1].fval, yyDollar[3].fval) + yyVAL.fval = yyDollar[1].fval / yyDollar[3].fval } case 12: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:52 { - yyVAL.fval = math.Pow(yyDollar[1].fval, yyDollar[3].fval) + yyVAL.fval = math.Mod(yyDollar[1].fval, yyDollar[3].fval) } case 13: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:53 { - yyVAL.fval = -yyDollar[2].fval + yyVAL.fval = math.Pow(yyDollar[1].fval, yyDollar[3].fval) } case 14: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line calc.y:54 { - yyVAL.fval = yyDollar[2].fval + yyVAL.fval = -yyDollar[2].fval } case 15: yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:55 { - yyVAL.fval = math.Abs(yyDollar[2].fval) + yyVAL.fval = yyDollar[2].fval } case 16: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line calc.y:56 { - yyVAL.fval = math.NaN() + yyVAL.fval = math.Abs(yyDollar[2].fval) } } goto yystack /* stack new state and value */ diff --git a/calc.y b/calc.y index bac526c..43c691c 100644 --- a/calc.y +++ b/calc.y @@ -38,6 +38,7 @@ line yylex.(*yyLex).ok = true } | WORD '=' exp { reg[$1] = $3 } + | error ; exp @@ -53,13 +54,12 @@ exp | '-' exp %prec UMINUS { $$ = -$2 } | '(' exp ')' { $$ = $2 } | '|' exp '|' { $$ = math.Abs($2) } - | error { $$ = math.NaN() } ; %% -func Parse(input string) (float64, bool) { +func Parse(input string) (float64, bool, error) { l := lex(input) yyParse(l) - return l.result, l.ok + return l.result, l.ok, l.err } diff --git a/lexer.go b/lexer.go index e7223a4..704c32c 100644 --- a/lexer.go +++ b/lexer.go @@ -1,7 +1,7 @@ package main import ( - "log" + "errors" "strconv" "strings" "unicode" @@ -34,10 +34,11 @@ type yyLex struct { items chan item result float64 ok bool + err error } func (y *yyLex) Error(s string) { - log.Println(s) + y.err = errors.New(s) } func (y *yyLex) Lex(lval *yySymType) int { @@ -45,7 +46,7 @@ func (y *yyLex) Lex(lval *yySymType) int { case number: n, err := strconv.ParseFloat(item.val, 64) if err != nil { - log.Println(err) + y.Error(err.Error()) } lval.fval = n return typemap[item.typ] diff --git a/main.go b/main.go index eeee6ab..f308378 100644 --- a/main.go +++ b/main.go @@ -16,8 +16,10 @@ func main() { fmt.Print(promt) for scanner.Scan() { line := scanner.Text() - result, ok := Parse(line) - if ok { + result, ok, err := Parse(line) + if err != nil { + fmt.Printf("error: %v\n\n", err) + } else if ok { fmt.Printf("%v\n\n", result) } fmt.Print(promt) -- cgit v1.2.3