cgo: implement prefix parsing
This implements expressions such as "-5" and "-5 - 2", in other words, negative numbers.
Этот коммит содержится в:
родитель
70f8eeaca0
коммит
711889bc3f
4 изменённых файлов: 19 добавлений и 0 удалений
12
cgo/const.go
12
cgo/const.go
|
@ -39,6 +39,7 @@ func init() {
|
||||||
token.STRING: parseBasicLit,
|
token.STRING: parseBasicLit,
|
||||||
token.CHAR: parseBasicLit,
|
token.CHAR: parseBasicLit,
|
||||||
token.LPAREN: parseParenExpr,
|
token.LPAREN: parseParenExpr,
|
||||||
|
token.SUB: parseUnaryExpr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +132,17 @@ func parseBinaryExpr(t *tokenizer, left ast.Expr) (ast.Expr, *scanner.Error) {
|
||||||
return expression, err
|
return expression, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseUnaryExpr(t *tokenizer) (ast.Expr, *scanner.Error) {
|
||||||
|
expression := &ast.UnaryExpr{
|
||||||
|
OpPos: t.curPos,
|
||||||
|
Op: t.curToken,
|
||||||
|
}
|
||||||
|
t.Next()
|
||||||
|
x, err := parseConstExpr(t, precedencePrefix)
|
||||||
|
expression.X = x
|
||||||
|
return expression, err
|
||||||
|
}
|
||||||
|
|
||||||
// unexpectedToken returns an error of the form "unexpected token FOO, expected
|
// unexpectedToken returns an error of the form "unexpected token FOO, expected
|
||||||
// BAR".
|
// BAR".
|
||||||
func unexpectedToken(t *tokenizer, expected token.Token) *scanner.Error {
|
func unexpectedToken(t *tokenizer, expected token.Token) *scanner.Error {
|
||||||
|
|
|
@ -44,6 +44,10 @@ func TestParseConst(t *testing.T) {
|
||||||
{`(1 - 2) * 3`, `(1 - 2) * 3`},
|
{`(1 - 2) * 3`, `(1 - 2) * 3`},
|
||||||
{`1 * 2 - 3`, `1*2 - 3`},
|
{`1 * 2 - 3`, `1*2 - 3`},
|
||||||
{`1 * (2 - 3)`, `1 * (2 - 3)`},
|
{`1 * (2 - 3)`, `1 * (2 - 3)`},
|
||||||
|
// Unary operators.
|
||||||
|
{`-5`, `-5`},
|
||||||
|
{`-5-2`, `-5 - 2`},
|
||||||
|
{`5 - - 2`, `5 - -2`},
|
||||||
} {
|
} {
|
||||||
fset := token.NewFileSet()
|
fset := token.NewFileSet()
|
||||||
startPos := fset.AddFile("", -1, 1000).Pos(0)
|
startPos := fset.AddFile("", -1, 1000).Pos(0)
|
||||||
|
|
2
testdata/cgo/main.go
предоставленный
2
testdata/cgo/main.go
предоставленный
|
@ -6,6 +6,7 @@ int fortytwo(void);
|
||||||
int mul(int, int);
|
int mul(int, int);
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#cgo CFLAGS: -DSOME_CONSTANT=17
|
#cgo CFLAGS: -DSOME_CONSTANT=17
|
||||||
|
#define someDefine -5 + 2 * 7
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
|
@ -26,6 +27,7 @@ func main() {
|
||||||
println("defined floats:", C.CONST_FLOAT, C.CONST_FLOAT2)
|
println("defined floats:", C.CONST_FLOAT, C.CONST_FLOAT2)
|
||||||
println("defined string:", C.CONST_STRING)
|
println("defined string:", C.CONST_STRING)
|
||||||
println("defined char:", C.CONST_CHAR)
|
println("defined char:", C.CONST_CHAR)
|
||||||
|
println("defined expr:", C.someDefine)
|
||||||
var ptr C.intPointer
|
var ptr C.intPointer
|
||||||
var n C.int = 15
|
var n C.int = 15
|
||||||
ptr = C.intPointer(&n)
|
ptr = C.intPointer(&n)
|
||||||
|
|
1
testdata/cgo/out.txt
предоставленный
1
testdata/cgo/out.txt
предоставленный
|
@ -8,6 +8,7 @@ defined ints: 5 5
|
||||||
defined floats: +5.800000e+000 +5.800000e+000
|
defined floats: +5.800000e+000 +5.800000e+000
|
||||||
defined string: defined string
|
defined string: defined string
|
||||||
defined char: 99
|
defined char: 99
|
||||||
|
defined expr: 9
|
||||||
15: 15
|
15: 15
|
||||||
25: 25
|
25: 25
|
||||||
callback 1: 50
|
callback 1: 50
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче