# Facc **Repository Path**: fawdlstty/Facc ## Basic Information - **Project Name**: Facc - **Description**: 基于.NET5的编译器生成工具 - **Primary Language**: C# - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-05-30 - **Last Updated**: 2021-07-12 ## Categories & Tags **Categories**: scripting-language **Tags**: None ## README # Facc Facc 是一种自制语言的工具,通过极简语法描述文法,自动生成AST代码。 特性: * 提供C++、C#实现,能生成C++、C#语言编写的解析器代码 * 支持左递归、间接左递归 ## 引言 编译原理自始至终都是非常难学的知识,虽然网上能找到各种各样的教程及文档,但也极少有开发者深入研究。本仓库作为另一种方案,以更简单的视角来解读编译原理,提供完善教程协助用户自主完成一个编译器。 ## 开始 首先,NuGet上安装Facc。 生成AST: ```csharp var _grammar = @" // 语法描述字符串 // 方括号代表匹配其中任一字符 num ::= [0-9]+ // 单引号或双引号代表匹配整个字符串,“|”代表“或”关系,匹配任一串字符串 op2_sign ::= '+' | '-' | '*' | '/' // 空格连接代表“与”关系,所有元素必须同时存在 op0_expr ::= '(' expr ')' // 匹配 1+2*3-4 这样的字符串 op2_expr ::= expr (op2_sign expr)+ // 表达式允许纯数字、括号或四则运算字符串 expr ::= num | op0_expr | op2_expr "; string _path = "D:\\ASTs"; // AST解析文件生成路径 string _namespace = "Facc.Example.ASTs"; // 生成的AST解析文件的命名空间 var _generator = new AstGenerator (_grammar, _path, _namespace); _generator.ClearPath (); // 清空指定路径下的所有文件 _generator.Generate (null); // 生成AST解析文件 ``` 执行生成的AST代码,解析文法: ```csharp var _ast_parser = new AstParser (); var _root = _ast_parser.Parse ("3+2*5-4+(123213213"); if (_root != null) { Console.WriteLine (); _root.PrintTree (0); } else { var _err =_ast_parser.Error; Console.WriteLine (); Console.WriteLine ($"Error in Line {_err.Line}: {_err.ErrorInfo}"); Console.WriteLine (_err.LineCode); Console.WriteLine ($"{new string (' ', _err.LinePos)}^"); } ``` ## 文档 - [第一章:语言基础](docs/chapter_1.md) - [第二章:编程语言语法](docs/chapter_2.md) - [第三章:Facc语法规范](docs/chapter_3.md) - [第四章:Facc 最佳实践](docs/chapter_4.md) ## License 代码开源方式:MIT 文档开源方式:CC-BY-SA 4.0