V/AST/C代码对照

V语言编译器的基本思路:V代码=>AST语法树=>C代码/js代码/…

源文件

编译单个V源文件生成ast.File,编译一组源文件,生成[ ]ast.File

  1. //AST代码
  2. pub struct File {
  3. pub:
  4. path string
  5. mod Module
  6. global_scope &Scope
  7. pub mut:
  8. scope &Scope
  9. stmts []Stmt //整个源文件的AST都在这里
  10. imports []Import
  11. errors []errors.Error
  12. warnings []errors.Warning
  13. }

模块

模块定义

  1. //V代码
  2. module main
  3. fn main() {
  4. println('from main')
  5. }
  1. //AST代码
  2. pub struct Module {
  3. pub:
  4. name string
  5. path string
  6. expr Expr
  7. pos token.Position
  8. is_skipped bool // module main can be skipped in single file programs
  9. }
  10. //AST实例
  11. {
  12. "ast_type": "Module",
  13. "name": "main",
  14. "path": "",
  15. "expr": "",
  16. "is_skipped": false,
  17. "pos": {
  18. "line_nr": 0,
  19. "pos": 0,
  20. "len": 19
  21. }
  22. }

V模块,生成C代码后,只是对应元素名称的前缀,毕竟C语言中没有模块的概念

常量,结构体,接口,类型等一级元素生成C代码后的名称规则是:”模块名__名称”,用双下划线区隔

比如mymodule模块中的add()函数生成C代码后的名称为:mymodule__add()

结构体的方法等二级元素生成C代码后的名称规则是:”模块名 _ 类名 方法名”,用单下划线区隔

比如mymodule模块中的Color结构体的str()方法生成C代码后的名称为:mymodule__Color_str()

  1. //C代码
  2. static void main__main();
  3. static void main__main() {
  4. println(tos_lit("from main"));
  5. }

导入模块

  1. //V代码
  2. import os
  1. //AST代码
  2. pub struct Import {
  3. pub:
  4. pos token.Position
  5. mod string
  6. alias string
  7. pub mut:
  8. syms []ImportSymbol
  9. }
  10. //AST实例
  11. {
  12. "ast_type": "Import",
  13. "mod": "os",
  14. "alias": "os",
  15. "syms": [],
  16. "pos": {
  17. "line_nr": 2,
  18. "pos": 20,
  19. "len": 2
  20. }
  21. }

常量

常量定义

枚举

枚举定义

  1. //V代码
  2. enum Color {
  3. white = 2
  4. black
  5. blue
  6. }
  1. //AST代码
  2. pub struct EnumField {
  3. pub:
  4. name string
  5. pos token.Position
  6. comments []Comment
  7. expr Expr
  8. has_expr bool
  9. }
  10. pub struct EnumDecl {
  11. pub:
  12. name string
  13. is_pub bool
  14. is_flag bool // true when the enum has [flag] tag
  15. is_multi_allowed bool
  16. comments []Comment // enum Abc { /* comments */ ... }
  17. fields []EnumField
  18. attrs []table.Attr
  19. pos token.Position
  20. }
  21. //AST实例
  22. {
  23. "ast_type": "EnumDecl",
  24. "name": "main.Color",
  25. "is_pub": false,
  26. "is_flag": false,
  27. "is_multi_allowed": false,
  28. "pos": {
  29. "line_nr": 9,
  30. "pos": 59,
  31. "len": 10
  32. },
  33. "fields": [{
  34. "ast_type": "EnumField",
  35. "name": "white",
  36. "has_expr": true,
  37. "expr": {
  38. "ast_type": "IntegerLiteral",
  39. "val": "2",
  40. "pos": {
  41. "line_nr": 10,
  42. "pos": 81,
  43. "len": 1
  44. }
  45. },
  46. "pos": {
  47. "line_nr": 10,
  48. "pos": 73,
  49. "len": 5
  50. },
  51. "comments": []
  52. }, {
  53. "ast_type": "EnumField",
  54. "name": "black",
  55. "has_expr": false,
  56. "expr": "",
  57. "pos": {
  58. "line_nr": 11,
  59. "pos": 84,
  60. "len": 5
  61. },
  62. "comments": []
  63. }, {
  64. "ast_type": "EnumField",
  65. "name": "blue",
  66. "has_expr": false,
  67. "expr": "",
  68. "pos": {
  69. "line_nr": 12,
  70. "pos": 91,
  71. "len": 4
  72. },
  73. "comments": []
  74. }],
  75. "comments": [],
  76. "attrs": []
  77. }
  1. //C代码
  2. typedef enum {
  3. main__Color_white = 2, // 2
  4. main__Color_black, // 2+1
  5. main__Color_blue, // 2+2
  6. } main__Color;

内置类型

数组

字典

函数

函数定义

函数调用

函数多返回值

流程控制

条件

匹配

循环

结构体

结构体定义

结构体初始化

结构体方法

  1. //V代码

类型

类型别名

  1. //V代码
  2. type Myint = int
  1. //AST代码
  2. pub struct AliasTypeDecl {
  3. pub:
  4. name string
  5. is_pub bool
  6. parent_type table.Type
  7. pos token.Position
  8. }
  9. //AST实例
  10. {
  11. "ast_type": "AliasTypeDecl",
  12. "name": "Myint",
  13. "is_pub": false,
  14. "parent_type": "int",
  15. "pos": {
  16. "line_nr": 20,
  17. "pos": 131,
  18. "len": 10
  19. }
  20. }
  1. //C代码
  2. typedef int main__Myint;

函数类型

  1. type MyFn = fn ( int, int) int
  1. pub struct FnTypeDecl {
  2. pub:
  3. name string
  4. is_pub bool
  5. typ table.Type
  6. pos token.Position
  7. }
  8. {
  9. "ast_type": "FnTypeDecl",
  10. "name": "main.MyFn",
  11. "is_pub": false,
  12. "typ": "main.MyFn",
  13. "pos": {
  14. "line_nr": 24,
  15. "pos": 171,
  16. "len": 9
  17. }
  18. }
  1. typedef int (*main__MyFn)(int,int);

联合类型

  1. type MySumtype = f32 | int | string
  1. pub struct SumTypeDecl {
  2. pub:
  3. name string
  4. is_pub bool
  5. sub_types []table.Type
  6. pos token.Position
  7. }
  8. {
  9. "ast_type": "SumTypeDecl",
  10. "name": "MySumtype",
  11. "is_pub": false,
  12. "sub_types": ["f32", "int", "string"],
  13. "pos": {
  14. "line_nr": 26,
  15. "pos": 204,
  16. "len": 14
  17. }
  18. }
  1. typedef struct {
  2. void* _object;
  3. int typ;
  4. } main__MySumtype;

接口

接口定义

泛型

泛型函数

泛型结构体