// units.y
// example of a goyacc program
// usage is
-// goyacc units.y (produces y.go)
+// goyacc -p "units_" units.y (produces y.go)
// 6g y.go
// 6l y.6
// ./6.out $GOROOT/src/cmd/goyacc/units
"os"
"math"
"strconv"
- "utf8"
+ "unicode/utf8"
)
const (
var linep int // index to next rune in unput
var nerrors int // error count
var one Node // constant one
-var peekrune int // backup runt from input
+var peekrune rune // backup runt from input
var retnode1 Node
var retnode2 Node
var retnode Node
type UnitsLex int
func (UnitsLex) Lex(yylval *units_SymType) int {
- var c, i int
+ var c rune
+ var i int
c = peekrune
peekrune = ' '
yylval.numb = 3
return SUP
}
- return c
+ return int(c)
alpha:
sym = ""
}
}
peekrune = c
- f, err := strconv.Atof64(sym)
+ f, err := strconv.ParseFloat(sym, 64)
if err != nil {
fmt.Printf("error converting %v\n", sym)
f = 0
* all characters that have some
* meaning. rest are usable as names
*/
-func ralpha(c int) bool {
+func ralpha(c rune) bool {
switch c {
case 0, '+', '-', '*', '/', '[', ']', '(', ')',
'^', ':', '?', ' ', '\t', '.', '|', '#',
/*
* number forming character
*/
-func rdigit(c int) bool {
+func rdigit(c rune) bool {
switch c {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'.', 'e', '+', '-':
return false
}
-func getrune() int {
- var c, n int
+func getrune() rune {
+ var c rune
+ var n int
if linep >= len(line) {
return 0