AST от [закрытого] кода C

Переменная, определенная ключевым словом let, видна только внутри блока scope , что означает область, определенную фигурными скобками. В вашем коде вы определяете genderPeer дважды, но в обоих случаях он виден только внутри этого небольшого блока кода:

if (employee.gender == 'M') {
    const lookupObject = {
        id: employee.peerID,
        gender: 'F',
    }
    let genderPeer = genderPayPeers.find(x => x._id == lookupObject);

} else {
    const lookupObject = {
        id: employee.peerID,
        gender: 'M',
    }
    let genderPeer = genderPayPeers.find(x => x._id == lookupObject);
}

Чтобы исправить это, вы должны переместить определение переменной за пределы этих областей, например:

let genderPeer;

if (employee.gender == 'M') {
    const lookupObject = {
        id: employee.peerID,
        gender: 'F',
    }
    genderPeer = genderPayPeers.find(x => x._id == lookupObject);

} else {
    const lookupObject = {
        id: employee.peerID,
        gender: 'M',
    }
    genderPeer = genderPayPeers.find(x => x._id == lookupObject);
}

22
задан Sachin Khot 27 October 2008 в 12:31
поделиться

10 ответов

См. pycparser - генератор AST чистого Python для C.

11
ответ дан 29 November 2019 в 04:34
поделиться

Существует два проекта, о которых я знаю и что Вы могли найти полезным:

они оба анализируют стандарт C исходный код для разрешения далее analisys и преобразование. Я не использовал их так, необходимо проверить на себя, если они соответствуют Вашим потребностям.

предложение использования GCC также допустимо, конечно. Я знаю, что нет большого количества документации относительно этого аспекта gcc, все же.

5
ответ дан 29 November 2019 в 04:34
поделиться

www.antlr.org

2
ответ дан 29 November 2019 в 04:34
поделиться

Наш DMS Software Reengineering Toolkit использовался в огромных C-системах для анализа, анализа, преобразования и регенерации C-кода. Работает в Windows и будет работать в Linux под Wine, но обрабатывает код C в стиле Linux (GCC).

Я не могу особо подчеркнуть способность обходить исходный код на C: анализировать, строить деревья, преобразовывать, регенерировать компилируемый C-код с комментариями и либо довольно напечатанными, либо с отступом оригинального программиста. Немногие из других ответов здесь предлагают системы, которые могут сделать это надежно.

Тот факт, что DMS предназначен для выполнения программных преобразований (в отличие от других систем, предложенных здесь в ответах), также является большим преимуществом. DMS обеспечивает сопоставление и переписывание древовидных шаблонов; это дополняет это полным контролем и анализом потока данных, который будет использоваться для расширения условий, которые вы хотите соответствовать. Инструмент, намеревающийся быть компилятором, - это именно то, и вам будет очень трудно убедить его не быть компилятором, а вместо этого быть механизмом преобразования, как запрашивал OP.

См. https://stackoverflow.com/a/2173477/120163 , например, AST, производимые DMS.

2
ответ дан 29 November 2019 в 04:34
поделиться

Можно попробовать, генерируют AST (Абстрактное синтаксическое дерево) использование Lexx и Yacc на Linux:

закон и yacc

от закона и yacc к ast

0
ответ дан 29 November 2019 в 04:34
поделиться

Как насчет того, чтобы брать gcc и записать пользовательский бэкенд для него? Я никогда не делал его, ни даже работал над gcc исходным кодом, таким образом, я не знаю, как трудно это было бы.

-1
ответ дан 29 November 2019 в 04:34
поделиться

Я бы порекомендовал лязг . Он имеет довольно полную реализацию C с большинством расширений gcc, и код очень понятен. Их реализация на C ++ неполна, но если вам нужно только генерировать AST из кода на C, это должно быть хорошо. В зависимости от того, что вы хотите сделать, вы можете либо использовать clang в качестве библиотеки и работать с AST напрямую, либо сделать так, чтобы clang выводил их на консоль.

18
ответ дан 29 November 2019 в 04:34
поделиться
2
ответ дан 29 November 2019 в 04:34
поделиться

I've done small amounts of work on source-to-source transformations and I found CIL to be very powerful for this task. CIL has the advantage of being a framework specifically designed for static source analysis and transformation. It can also process code with any amount of ugly GCC specific extensions(It's been used to process the Linux kernel, as one example.) Unfortunately, it is written in OCAML, and analyses/transformations built using it must also be writtne in OCAML, which might be problematic if you've never used it.

Alternatively, clang is supposed to have a relatively easily-hackable codebase and it can certainly be used to produce C AST's.

1
ответ дан 29 November 2019 в 04:34
поделиться

«Я пробовал ELSA, но она не компилируется . (Я использую Ubuntu 8.4)»

Исходный код Elkhound и Elsa, версия 2005.08. 22b с сайта scottmcpeak.com/elkhound/ устарел (старые заголовочные файлы в стиле C ++ .h).

Эльза работает и является частью Oink: http://www.cubewano.org/oink/#Gettingthecode Я только что заставил его работать под Ubuntu 9.10.

0
ответ дан 29 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: