Skip to content

内部構造 関数の登録に関して

kujirahand edited this page Sep 1, 2024 · 4 revisions

なでしこの関数登録について

関数の後方参照が可能になっています。そのため、NakoLexerのpreDefineFuncで事前に関数名と引数を登録します。

字句解析の手順

  • NakoCompiler.compile(code, filename) => string(JSCode)
    • NakoCompiler.parse(code, filename) => AST
      • NakoCompiler.lex(code, filename) => AST
        • NakoCompiler.rawtokenize(code, lineNo, filename) => Token[]
          • prepare.convert(code) → 全角半角の統一
          • lexer.tokenize => Token[] → トークン分割
            • nako_lex_rulesのNakoLexRuleに基づいてトークンを分割
          • convertDNCL2 → 分割されたトークンを元にしてDNCL/DNCL2に変換する
          • convertIndexSyntax → 分割されたトークンを元にしてインデント構文を処理
          • convertInineIndents(tokens) → 分割されたトークンを元にしてインラインインデントを処理   - NakoCompiler.converttoken
      • lexer.replaceTokens ... 関数の登録を行い、TokenType.wordをfuncに変換する
        • NakoLexer.preDefineFunc
        • lexer._replaceWord ... TokenType.wordをfuncに変換 / 数字にくっついたマイナスの処理 / 「は」を「=」に置換など

構文解析の手順

  • NakoCompiler.parse
    • this.lex --- 上記参照
    • NakoParser.parse(tokens, filename) => AST
      • ASTに変換後、関数ごとにasyncFnの判定を行う