2008-11-14 3 views
2

Есть ли способ сделать это почти из коробки?Использование C# и gppg, как бы я построил абстрактное синтаксическое дерево?

Я могу пойти и написать большой метод, который будет использовать собранные жетоны, чтобы выяснить, какие листья следует помещать в какие ветви и в конце заполнять объект TreeNode, но поскольку gppg уже обрабатывал все, используя предоставленные регулярные выражения, Мне было интересно, есть ли более простой способ? Даже если это не так, любые рекомендации относительно того, как лучше всего подойти к проблеме создания АСТ, будут оценены.

Извинения, если я сказал что-то глупое, я только начинаю играть в компилятор. :)

ответ

0

Взгляните на ANTLR, я сделал простой .NET компилятор, написанный на C# с ним несколько лет назад.

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)