gpt4 book ai didi

parsing - 如何使我的 go 解析器代码更具可读性

转载 作者:行者123 更新时间:2023-12-03 01:29:51 26 4
gpt4 key购买 nike

我正在用 Go 为一种简单的虚构语言编写一个递归下降解析器,所以我正在设计语法。我的解析器可以工作,但我想问是否有任何最佳实践来说明我应该如何布局我的代码,或者何时应该将代码放入其自己的函数中等等......以使其更具可读性。

我一直按照我到目前为止学到的简单规则来构建解析器。每个非终端都是它自己的函数,尽管我的代码可以工作,但我认为看起来非常困惑且不可读。

我已经包含了非终结符赋值的代码以及函数上方的语法。

我删除了大部分错误处理以保持函数更小。

以下是该代码可以解析的一些示例:

a = 10
a,b,c = 1,2,3
a int = 100
a,b string = "hello", "world"

有人可以给我一些关于如何使我的代码更具可读性的建议吗?

// assignment                 : variable_list '=' expr_list
// | variable_list type
// | variable_list type '=' expr_list
func (p *Parser) assignment() ast.Noder {

assignment := &ast.AssignmentNode{}

assignment.Left = p.variable_list()

// This if-statement deals with rule 2 or 3
if p.currentToken.Type != token.ASSIGN {
// Static variable declaration
// Could be a declaration or an assignment
// Only static variables can be declared without providing a value
assignment.IsStatic = true

assignment.Type = p.var_type().Value

assignment.Right = nil

p.nextToken()
// Rule 2 is finished at this point in the code
// This if-statement is for rule 3
if p.currentToken.Type == token.ASSIGN {
assignment.Operator = p.currentToken

p.nextToken()

assignment.Right = p.expr_list()
}

} else {
// This deals with rule 1
assignment.Operator = p.currentToken

p.nextToken()

assignment.Right = p.expr_list()

}

if assignment.Right == nil {
for i := 0; i < len(assignment.Left); i++ {
assignment.Right = append(assignment.Right, nil)
}
}

if len(assignment.Left) != len(assignment.Right) {
p.FoundError(p.syntaxError("variable mismatch, " + strconv.Itoa(len(assignment.Left)) + " on left but " + strconv.Itoa(len(assignment.Right)) + " on right,"))
}

return assignment
}

最佳答案

how I can make my code more readable?

<小时/>

为了可读性,这是正确、可维护代码的先决条件,

// assignment                 : variable_list '=' expr_list
// | variable_list type
// | variable_list type '=' expr_list
func (p *Parser) assignment() ast.Noder {
assignment := &ast.AssignmentNode{}

// variable_list
assignment.Left = p.variable_list()

// type
if p.currentToken.Type != token.ASSIGN {
// Static variable declaration
// Could be a declaration or an assignment
// Only static variables can be declared without providing a value
assignment.IsStatic = true

assignment.Type = p.var_type().Value
p.nextToken()
}

// '=' expr_list
if p.currentToken.Type == token.ASSIGN {
assignment.Operator = p.currentToken
p.nextToken()
assignment.Right = p.expr_list()
}

// variable_list [expr_list]
if assignment.Right == nil {
for i := 0; i < len(assignment.Left); i++ {
assignment.Right = append(assignment.Right, nil)
}
}
if len(assignment.Left) != len(assignment.Right) {
p.FoundError(p.syntaxError(fmt.Sprintf(
"variable mismatch, %d on left but %d on right,",
len(assignment.Left), len(assignment.Right),
)))
}

return assignment
}
<小时/>

注意:这可能效率低下且过于复杂:

for i := 0; i < len(assignment.Left); i++ {
assignment.Right = append(assignment.Right, nil)
}

assignment.Right 的类型是什么?

关于parsing - 如何使我的 go 解析器代码更具可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com