3 回答

TA貢獻1818條經驗 獲得超11個贊
您可以使用regexp.Split()(就像您所做的那樣)獲取表達式的操作數,并且可以使用regexp.FindAllString().
通過這樣做,您將擁有 2 個單獨的[]string切片,如果您希望將結果合并為一個切片,則可以合并這 2 個[]string切片。
input := "house-width + 3 - y ^ (5 * house length)"
r := regexp.MustCompile(`\s([+\-/*^])\s`)
s1 := r.Split(input, -1)
s2 := r.FindAllString(input, -1)
fmt.Printf("%q\n", s1)
fmt.Printf("%q\n", s2)
all := make([]string, len(s1)+len(s2))
for i := range s1 {
all[i*2] = s1[i]
if i < len(s2) {
all[i*2+1] = s2[i]
}
}
fmt.Printf("%q\n", all)
輸出(在Go Playground上試試):
["house-width" "3" "y" "(5" "house length)"]
[" + " " - " " ^ " " * "]
["house-width" " + " "3" " - " "y" " ^ " "(5" " * " "house length)"]
筆記:
如果要修剪運算符中的空格,可以使用該strings.TrimSpace()函數:
for i, v := range s2 {
all[i*2+1] = strings.TrimSpace(v)
}
fmt.Printf("%q\n", all)
輸出:
["house-width" "+" "3" "-" "y" "^" "(5" "*" "house length)"]

TA貢獻1876條經驗 獲得超5個贊
如果您打算在之后解析表達式,則必須進行一些更改:
包括括號作為詞素
你不能讓空格和破折號都是有效的標識符字符,因為例如在兩者- y之間3并且^將是一個有效的標識符。
完成后,您可以使用簡單的線性迭代來對字符串進行詞法分析:
package main
import (
"bytes"
"fmt"
)
func main() {
input := `house width + 3 - y ^ (5 * house length)`
buffr := bytes.NewBuffer(nil)
outpt := make([]string, 0)
for _, r := range input {
if r == '+' || r == '-' || r == '*' || r == '/' || r == '^' || r == '(' || r == ')' || (r >= '0' && r <= '9') {
bs := bytes.TrimSpace(buffr.Bytes())
if len(bs) > 0 {
outpt = append(outpt, (string)(bs))
}
outpt = append(outpt, (string)(r))
buffr.Reset()
} else {
buffr.WriteRune(r)
}
}
fmt.Printf("%#v\n", outpt)
}
詞法分析后,使用 Dijkstra 的分流碼算法構建 AST 或直接評估表達式。
- 3 回答
- 0 關注
- 222 瀏覽
添加回答
舉報