line/col 在 clang ast dump 中是什么意思
what does the line/col mean in clang ast dump
我对 clang ast-dump outout 感到困惑,line 和 col 是什么意思?
谢谢
`-FunctionDecl 0xa853e98 <line:33:1, line:44:1> line:33:5 main 'int (void)'
-CompoundStmt 0xa87f018 <line:34:1, line:44:1>
|-DeclStmt 0xa87e808 <line:35:1, col:11>
|
-VarDecl 0xa853fb8 col:9 使用了 'class Anmimal' callinit
| -CXXConstructExpr 0xa87e7d8 <col:9> 'class Anmimal' 'void (void) throw()'
|-BinaryOperator 0xa87e8a0 <line:36:1, col:10> 'int' lvalue '='
| |-MemberExpr 0xa87e848 <col:1, col:4> 'int' lvalue .age 0xa8533b0
| |
-DeclRefExpr 0xa87e820 'class Anmimal' 左值 Var 0xa853fb8 'an' 'class Anmimal'
| -IntegerLiteral 0xa87e880 <col:10> 'int' 100
|-CXXMemberCallExpr 0xa87e9f0 <line:38:1, col:12> 'int'
|
-MemberExpr 0xa87e9b8 ''.getSize 0xa853c48
| -DeclRefExpr 0xa87e990 <col:1> 'class Anmimal' lvalue Var 0xa853fb8 'an' 'class Anmimal'
|-DeclStmt 0xa87edb0 <line:40:1, col:8>
|
-VarDecl 0xa87ea28 col:5 使用 cat 'struct Cat' callinit
| -CXXConstructExpr 0xa87ed80 <col:5> 'struct Cat' 'void (void) throw()'
|-BinaryOperator 0xa87ee48 <line:41:1, col:15> 'int' lvalue '='
| |-MemberExpr 0xa87edf0 <col:1, col:5> 'int' lvalue .age_cat 0xa853b38
| |
-DeclRefExpr 0xa87edc8 'struct Cat' 左值 Var 0xa87ea28 'cat' 'struct Cat'
| -IntegerLiteral 0xa87ee28 <col:15> 'int' 10
|-BinaryOperator 0xa87efb8 <line:42:1, col:16> 'int' lvalue '='
| |-MemberExpr 0xa87ef60 <col:1, col:5> 'int' lvalue .size_cat 0xa853b98
| |
-DeclRefExpr 0xa87ef38 'struct Cat' 左值 Var 0xa87ea28 'cat' 'struct Cat'
| -IntegerLiteral 0xa87ef98 <col:16> 'int' 20
-ReturnStmt 0xa87f000
`-IntegerLiteral 0xa87efe0 'int' 0
它们是与 AST 的每个节点关联的源位置:文件、行和列。 Clang 通常报告节点的开始或节点覆盖的范围。为了保存space,当文件名与前面的节点相同时,Clang 不重复。行号也是如此。算法是
if(filename != old_filename)
print filename:line:column
old_filename = filename
elseif(line != old_line)
print line:column
old_line = line
else
print column
因此 main()
的函数声明跨越第 33-44 行。似乎 main 的声明从 col 开始。第 33 行的第 5 行。依此类推。
可以通过各种 AST 对象上的 getLocStart()
、getLocEnd()
和 getSourceRange()
方法以编程方式访问源位置,从而允许对源代码进行精确更改。
我对 clang ast-dump outout 感到困惑,line 和 col 是什么意思? 谢谢
`-FunctionDecl 0xa853e98 <line:33:1, line:44:1> line:33:5 main 'int (void)'
-CompoundStmt 0xa87f018 <line:34:1, line:44:1>
|-DeclStmt 0xa87e808 <line:35:1, col:11>
|
-VarDecl 0xa853fb8 col:9 使用了 'class Anmimal' callinit
| -CXXConstructExpr 0xa87e7d8 <col:9> 'class Anmimal' 'void (void) throw()'
|-BinaryOperator 0xa87e8a0 <line:36:1, col:10> 'int' lvalue '='
| |-MemberExpr 0xa87e848 <col:1, col:4> 'int' lvalue .age 0xa8533b0
| |
-DeclRefExpr 0xa87e820 'class Anmimal' 左值 Var 0xa853fb8 'an' 'class Anmimal'
| -IntegerLiteral 0xa87e880 <col:10> 'int' 100
|-CXXMemberCallExpr 0xa87e9f0 <line:38:1, col:12> 'int'
|
-MemberExpr 0xa87e9b8 ''.getSize 0xa853c48
| -DeclRefExpr 0xa87e990 <col:1> 'class Anmimal' lvalue Var 0xa853fb8 'an' 'class Anmimal'
|-DeclStmt 0xa87edb0 <line:40:1, col:8>
|
-VarDecl 0xa87ea28 col:5 使用 cat 'struct Cat' callinit
| -CXXConstructExpr 0xa87ed80 <col:5> 'struct Cat' 'void (void) throw()'
|-BinaryOperator 0xa87ee48 <line:41:1, col:15> 'int' lvalue '='
| |-MemberExpr 0xa87edf0 <col:1, col:5> 'int' lvalue .age_cat 0xa853b38
| |
-DeclRefExpr 0xa87edc8 'struct Cat' 左值 Var 0xa87ea28 'cat' 'struct Cat'
| -IntegerLiteral 0xa87ee28 <col:15> 'int' 10
|-BinaryOperator 0xa87efb8 <line:42:1, col:16> 'int' lvalue '='
| |-MemberExpr 0xa87ef60 <col:1, col:5> 'int' lvalue .size_cat 0xa853b98
| |
-DeclRefExpr 0xa87ef38 'struct Cat' 左值 Var 0xa87ea28 'cat' 'struct Cat'
| -IntegerLiteral 0xa87ef98 <col:16> 'int' 20
-ReturnStmt 0xa87f000
`-IntegerLiteral 0xa87efe0 'int' 0
它们是与 AST 的每个节点关联的源位置:文件、行和列。 Clang 通常报告节点的开始或节点覆盖的范围。为了保存space,当文件名与前面的节点相同时,Clang 不重复。行号也是如此。算法是
if(filename != old_filename)
print filename:line:column
old_filename = filename
elseif(line != old_line)
print line:column
old_line = line
else
print column
因此 main()
的函数声明跨越第 33-44 行。似乎 main 的声明从 col 开始。第 33 行的第 5 行。依此类推。
可以通过各种 AST 对象上的 getLocStart()
、getLocEnd()
和 getSourceRange()
方法以编程方式访问源位置,从而允许对源代码进行精确更改。