2

これをほとんどすぐに使用できる方法はありますか?

収集したトークンを使用して、どのリーフをどのブランチに配置する必要があるかを判断し、最終的に TreeNode オブジェクトを生成する大きなメソッドを作成することもできましたが、gppg は提供された正規表現を使用してすべてを処理していたため、もっと簡単な方法はありますか?そうでない場合でも、AST を作成する問題にどのようにアプローチするのが最善かについての指針をいただければ幸いです。

ばかげたことを言って申し訳ありませんが、私はコンパイラ ゲームを始めたばかりです。:)

4

3 に答える 3

1
  1. 構文ファイルで、AST のルートを保持するプロパティを宣言します。

    {%
    public BatchNode Batch;
    public ErrorHandler yyhldr;
    private TransformationContext _txContext = TransformationContext.Instance;
    %}
    
  2. AST のノードを構築するアクションで文法を書き始めます。

    Batch
        : StatementList {Batch = new BatchNode($1.Statements);}
        ;
    
    StatementList
        : Statement {$$.Statements = new List<StatementNode>(); $$.Statements.Add($1.Statement); }
        | StatementList Statement   {$$.Statements = $1.Statements; $$.Statements.Add($2.Statement);}
        ;
    
  3. 呼び出しパーサー:

    var parser = new Parser.Parser();
    var scanner = new Scanner();
    parser.scanner = scanner;
    scanner.SetSource(sourceString, 0);
    bool result = parser.Parse();
    if (result)
        HandleMyAst(parser.Batch)
    
于 2010-05-06T00:39:21.917 に答える
1

MGramar と Oslo を参照してください...

http://msdn.microsoft.com/oslo

http://channel9.msdn.com/pdc2008/TL31/

于 2008-11-14T17:04:55.043 に答える
0

ANTLRを見てください。私は数年前に C# で書かれた単純な .NET コンパイラを作成しました。

于 2008-11-14T18:04:45.297 に答える