\documentclass[../main.tex]{subfiles}


\begin{document}

\section{源程序清单}

为了使得项目开发更加清晰，程序中由五个C\#项目组成：
\begin{itemize}
    \item Canon.Core 编译器的核心库，含有编译器的所有核心功能。
    \item Canon.Tests 编译器核心库的测试库，含有项目中编写的所有单元测试。
    \item Canon.Console 编译器的命令行版本程序，在核心库的基础上以命令行的方式同编译器进行交互。
    \item Canon.Server 编译器的服务器版本程序，以Web的方式同编译器进行交互。
    \item Canon.Generator 用于生成源代码形式的LR(1)分析表的工具。
\end{itemize}

代码中的总行数如表\ref{tab:code_lines}所示。

\begin{table}[htbp]
    \centering
    \begin{tabular}{|l|r|r|r|r|r|}
        \hline
        语言 & 文件数 & 行数 & 空白行数 & 注释数 & 代码行数 \\
        \hline
        C\# & 132 & 13263 & 1889  &    978 &  10396   \\
        Pascal & 95 & 4989 & 368 & 34 &   4587  \\
        TypeScript & 8   &   521   &   52   &     7   &  462 \\
        MSBuild &  6    &  195   &   23   &     2   &  170 \\
        TypeScript Typings &  2 & 149  &   7  &  13  & 129 \\
        HTML  & 1     &  12   &    0    &    0     & 12 \\
        Python & 1 & 111 & 26 &  0 & 85 \\
        \hline
    \end{tabular}
    \caption{代码行数统计}
    \label{tab:code_lines}
\end{table}

\subsection{Canon.Core项目}

\begin{verbatim}
.
├── Abstractions
│   ├── ICompilerLogger.cs
│   ├── IGrammarParser.cs
│   ├── ILexer.cs
│   ├── ISourceReader.cs
│   ├── ITransformer.cs
│   └── SyntaxNodeVisitor.cs
├── Canon.Core.csproj
├── CodeGenerators
│   └── CCodeBuilder.cs
├── Enums
│   ├── BasicType.cs
│   ├── ErrorEnums.cs
│   ├── GrammarEnums.cs
│   └── SemanticEnums.cs
├── Exceptions
│   ├── GrammarException.cs
│   ├── LexemeException.cs
│   ├── ReduceAndShiftConflictException.cs
│   └── ReduceConflictException.cs
├── GrammarParser
│   ├── Expression.cs
│   ├── GeneratedParser.g.cs
│   ├── GrammarBuilder.cs
│   ├── Grammar.cs
│   ├── LrState.cs
│   ├── PascalGrammar.cs
│   └── Terminator.cs
├── LexicalParser
│   ├── LexemeFactory.cs
│   ├── Lexer.cs
│   ├── LexRules.cs
│   └── SemanticToken.cs
├── SemanticParser
│   ├── CodeGeneratorVisitor.cs
│   ├── PascalArrayType.cs
│   ├── PascalBasicType.cs
│   ├── PascalFunctionType.cs
│   ├── PascalParameterType.cs
│   ├── PascalType.cs
│   ├── Symbol.cs
│   ├── SymbolTable.cs
│   ├── SyntaxTreeTraveller.cs
│   ├── TypeCheckVisitor.cs
│   └── TypeTable.cs
└── SyntaxNodes
    ├── AddOperator.cs
    ├── BasicType.cs
    ├── CompoundStatement.cs
    ├── ConstDeclaration.cs
    ├── ConstDeclarations.cs
    ├── ConstValue.cs
    ├── ElsePart.cs
    ├── Expression.cs
    ├── ExpressionList.cs
    ├── Factor.cs
    ├── FormalParameter.cs
    ├── IdentifierList.cs
    ├── IdentifierVarPart.cs
    ├── MultiplyOperator.cs
    ├── NonTerminatedSyntaxNode.cs
    ├── Parameter.cs
    ├── ParameterList.cs
    ├── Period.cs
    ├── ProcedureCall.cs
    ├── ProgramBody.cs
    ├── ProgramHead.cs
    ├── ProgramStruct.cs
    ├── RelationOperator.cs
    ├── SimpleExpression.cs
    ├── Statement.cs
    ├── StatementList.cs
    ├── SubprogramBody.cs
    ├── Subprogram.cs
    ├── SubprogramDeclarations.cs
    ├── SubprogramHead.cs
    ├── SyntaxNodeBase.cs
    ├── Term.cs
    ├── TerminatedSyntaxNode.cs
    ├── TypeSyntaxNode.cs
    ├── ValueParameter.cs
    ├── VarDeclaration.cs
    ├── VarDeclarations.cs
    ├── Variable.cs
    └── VarParameter.cs
\end{verbatim}

\subsection{Canon.Console项目}

\begin{verbatim}
.
├── Canon.Console.csproj
├── Extensions
│   └── RootCommandExtensions.cs
├── Models
│   └── CompilerOption.cs
├── Program.cs
└── Services
    ├── Compiler.cs
    ├── CompilerLogger.cs
    └── StringSourceReader.cs
\end{verbatim}

\subsection{Canon.Server项目}

\begin{verbatim}
.
├── appsettings.json
├── Canon.Server.csproj
├── client-app
│   ├── index.html
│   ├── package.json
│   ├── pnpm-lock.yaml
│   ├── public
│   │   └── pic
│   │       └── uncompiled.png
│   ├── src
│   │   ├── App.tsx
│   │   ├── main.tsx
│   │   ├── openapi.d.ts
│   │   ├── Pages
│   │   │   ├── HistoryPage.tsx
│   │   │   ├── Index.tsx
│   │   │   ├── InputField.tsx
│   │   │   ├── Loader.tsx
│   │   │   └── OutputField.tsx
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
├── Controllers
│   ├── CompilerController.cs
│   └── FileController.cs
├── DataTransferObjects
│   ├── CompileResponse.cs
│   └── SourceCode.cs
├── Dockerfile
├── Entities
│   └── CompileResult.cs
├── Extensions
│   └── ServiceCollectionExtensions.cs
├── Models
│   ├── Brush.cs
│   ├── CodeReader.cs
│   ├── CompilerLogger.cs
│   └── PresentableTreeNode.cs
├── Program.cs
├── Properties
│   └── launchSettings.json
├── Services
│   ├── CompileDbContext.cs
│   ├── CompilerService.cs
│   ├── DatabaseSetupService.cs
│   ├── GridFsService.cs
│   └── SyntaxTreePresentationService.cs
└── wwwroot
\end{verbatim}

\subsection{Canon.Generator项目}

\begin{verbatim}
.
├── Canon.Generator.csproj
├── Extensions
│   └── RootCommandExtension.cs
├── GrammarGenerator
│   ├── GenerateCommand.cs
│   ├── GeneratedGrammarParser.cs
│   ├── GeneratedTransformer.cs
│   └── GrammarExtensions.cs
├── Program.cs
└── SyntaxVisitorGenerator
    └── SyntaxVisitorGenerator.cs
\end{verbatim}

\subsection{Canon.Tests项目}

\begin{verbatim}
.
├── Canon.Tests.csproj
├── GeneratedParserTests
│   └── GenerateParserTests.cs
├── GlobalUsings.cs
├── GrammarParserTests
│   ├── PascalGrammarFailedTests.cs
│   ├── PascalGrammarTests.cs
│   ├── SimpleGrammarTests.cs
│   ├── SimpleGrammarWithEmptyTests.cs
│   └── TerminatorTests.cs
├── LexicalParserTests
│   ├── CharacterTypeTests.cs
│   ├── DelimiterTests.cs
│   ├── ErrorSingleTests.cs
│   ├── IndentifierTypeTests.cs
│   ├── KeywordTypeTests.cs
│   ├── LexicalFileTests.cs
│   ├── NumberTests.cs
│   └── OperatorTypeTests.cs
├── SemanticTests
│   ├── ConstValueTests.cs
│   ├── PascalTypeTests.cs
│   ├── SymbolTableTests.cs
│   ├── SyntaxTreeTravellerTests.cs
│   ├── Tests.cs
│   └── TypeCheckVisitorTests.cs
└── Utils
    ├── CompilerHelpers.cs
    ├── EnumerableExtensions.cs
    ├── SampleSyntaxTreeVisitor.cs
    ├── StringSourceReader.cs
    ├── StringSourceReaderTests.cs
    └── TestLogger.cs
\end{verbatim}

\end{document}