Используя C # и gppg, как мне построить абстрактное синтаксическое дерево? - PullRequest
2 голосов
/ 14 ноября 2008

Есть ли способ сделать это почти из коробки?

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

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

Ответы [ 3 ]

1 голос
/ 06 мая 2010
  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)
    
1 голос
/ 14 ноября 2008
0 голосов
/ 14 ноября 2008

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

...