2013-09-10 2 views
17

Есть ли процесс получения дерева синтаксиса компилятора. Мы были назначены в проекте, который должен получить доступ к дереву синтаксиса машинописного текста (который является открытым исходным кодом, чтобы мы могли видеть весь код компилятора). Но мы не знаем, как это получить. Я читал некоторые статьи в Интернете, но я не могу найти удобную для пользователя статью или написанную в терминах Лемана. Я считаю, что некоторые упомянули, что первый шаг, который нам нужно сделать, - найти шаг синтаксического анализа. Но после этого мы понятия не имели, что делать дальше.Как мы можем получить дерево синтаксиса TypeScript?

Извините за вопрос о нобе. :)

+1

Там не много помощи для вас, за исключением, возможно, от кого-то есть уже вырыто через этот код. Что вы изучаете, так это то, что в большой части программного обеспечения трудно найти свой путь. Вам нужно потратить время на рытье в источнике. Очевидным трюком является поиск исходного кода для слов «parse», «tree» и «node»; код для определения/построения АСТ, несомненно, близок к тому, где один из них найден, если код не ужасен. Для этой цели стандартными инструментами, любимыми многими программистами, являются «grep». Если вы не знаете, что это такое, узнайте в Википедии. –

+1

Ответы на этот более поздний вопрос могут быть полезны ... [TypeScript: получить дерево синтаксиса] (http://stackoverflow.com/questions/20187928/typescript-get-syntax-tree) – Fenton

+0

Я написал ответ о том, как получить C# в AST, прежде чем понять, что такое TypeScript. Есть ли причина, по которой отмечен C#? – Chuu

ответ

1

Вам нужно получить AST от конкретного компилятора или просто получить синтаксическое дерево из программы в TypeScript? Если вас интересует более поздняя версия, то вам может понадобиться захватить грамматику BNF для TypeScript (начальная точка here), а затем, например, использовать ANTLR. Он имеет инструмент ANTLRWorks, который позволяет визуализировать дерево синтаксиса программы.

6

API-интерфейс компилятора TypeScript действительно очень прост в использовании. Чтобы разобрать файл машинописи и получить AST, попробуйте следующее:

const ts = require('typescript'); 
const sourceFile = ts.createSourceFile(filename, 
    fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, false); 
console.log(sourceFile.ast); 

Это создает AST, например:

{ 
    "kind": 251, 
    "pos": 0, 
    "end": 1097, 
    "flags": 0, 
    "bindDiagnostics": [], 
    "languageVersion": 2, 
    "fileName": "slidingWindow.ts", 
    "languageVariant": 0, 
    "scriptKind": 3, 
    "referencedFiles": [], 
    "amdDependencies": [], 
    "statements": [ 
    { 
     "kind": 218, 
     "pos": 0, 
     "end": 69, 
     "flags": 0, 
     "name": { 
     "kind": 69, 
     "pos": 10, 
     "end": 22, 
     "flags": 0, 
     "text": "Accumulator", 
     "kindDecoded": "Identifier" 
     }, 
     "members": [ 
     { 
      "kind": 148, 
      "pos": 24, 
      "end": 67, 
      "flags": 0, 
      "parameters": [ 
      { 
       "kind": 139, 
       "pos": 28, 
       "end": 42, 
       "flags": 0, 
       "name": { 
       "kind": 69, 
       "pos": 28, 
       "end": 32, 
       "flags": 0, 
       "text": "data", 
       "kindDecoded": "Identifier" 
       }, 
       "type": { 
       "kind": 157, 
       "pos": 33, 
       "end": 42, 
       "flags": 0, 
       "elementType": { 
        "kind": 128, 
        "pos": 33, 
        "end": 40, 
        "flags": 0, 
        "kindDecoded": "NumberKeyword" 
       }, 
       "kindDecoded": "ArrayType" 
       }, 
       "kindDecoded": "Parameter" 
      }, 
      { 
       "kind": 139, 
       "pos": 43, 
       "end": 57, 
       "flags": 0, 
       "name": { 
       "kind": 69, 
       "pos": 43, 
       "end": 49, 
       "flags": 0, 
       "text": "index", 
       "kindDecoded": "Identifier" 
       }, 
       "type": { 
       "kind": 128, 
       "pos": 50, 
       "end": 57, 
       "flags": 0, 
       "kindDecoded": "NumberKeyword" 
       }, 
       "kindDecoded": "Parameter" 
      } 
      ], 
      "type": { 
      "kind": 128, 
      "pos": 59, 
      "end": 66, 
      "flags": 0, 
      "kindDecoded": "NumberKeyword" 
      }, 
      "kindDecoded": "CallSignature" 
     } 
     ], 
     "kindDecoded": "InterfaceDeclaration" 
    }, 
... 
Смежные вопросы