# 语法分析器文档

> 隶属于``编译器开发文档.md``

语法分析器的代码位于``src/compiler/Parser.cpp``当中。 Parser类（``stamon::c::Parser``）即为语法分析器的主体。

##### 核心接口

语法分析器的构造函数原型为：

```C++
Parser(
    Matcher matcher, STMException* e,
    SyntaxScope global_scope, String filename,
    ArrayList<SourceSyntax>* src, HashMap<String, bool> map,
    ArrayList<String>* error_msg, ArrayList<String>* warning_msg,
    bool is_support_import
);
```

其中，``matcher``为Token匹配器；``global_scope``为给定的全局作用域；``filename``为当前匹配的文件名；``src``为一个以文件为单位所存储的AST列表，作为输出参数，在递归分析其他被引用的文件时，语法分析器会把被引用文件的AST加入到src，但其本身生成的AST并不会加入进去；``map``用于标记某些文件是否被分析过（防止递归引用）；``error_msg``作为输出参数，用于存储报错信息；``warning_msg``作为输出参数，用于存储警告信息；``is_support_import``用于指示是否支持import（防止某些平台不支持文件处理）。

在初始化语法分析器后，调用``ast::AstNode* Parse()``函数即可获得AST的根节点。

##### 基本原理

语法分析器主要采用递归分析，具体的文法请见``src/compiler/ebnf.txt``。