Чапи
Чапи — это анализатор структуры данных общего языка, который будет анализировать различные языки для получения одного и того же объекта JSON.
Стадии языков (добро пожаловать в PR для использования ваших языков)
Функции/Языки | Java | Python | Go | Kotlin | TypeScript | C | C# | Scala | C++ |
---|---|---|---|---|---|---|---|---|---|
Синтаксический анализ | ✅ | ✅ | ✅ | 🆕 | ✅ | 🆕 | 🆕 | 🆕 | 🆕 |
Вызов функции | ✅ | 🆕 | ✅ | ||||||
Архитектура/пакет | ✅ | ||||||||
Проверка реального мира | ✅ | ||||||||
Выражение (TBD) |
Семейство языков wiki
Семейство Алгол https://wiki.c2.com/?AlgolFamily
Языки | Планируемая поддержка | |
---|---|---|
Семейство C | C#, Java, Go, C, C++, Objective-C, Rust и т. д. | C++, C, Java, C#, Rust? |
Функциональные | Scheme, Lisp, Clojure, Scala и т.д. | Scala |
Скриптовые | Lua, PHP, JavaScript, Python, Perl, Ruby и т. д. | Python, JavaScript |
Другие | Fortran, Swift, Matlab и т. д. | Swift?, Fortran? |
PS: добро пожаловать в PR, чтобы отправить свои проекты.
dependencies {
implementation 'com.phodal.chapi:chapi-application:0.0.7'
// или выберите целевой язык
implementation 'com.phodal.chapi:chapi-ast-java:0.0.7'
implementation 'com.phodal.chapi:chapi-domain:0.0.7'
}
import chapi.domain.core.CodeCall
import chapi.domain.core.CodeDataStruct
import chapi.app.analyser
...
val nodes = ChapiAnalyser().analysisByPath(path.absolutePath)
...
Примеры исходного кода на Java:
package adapters.outbound.persistence.blog;
public class BlogPO implements PersistenceObject<Blog> {
@Override
public Blog toDomainModel() {
}
}
Примеры вывода:
{
"Imports": [],
"Implements": [
"PersistenceObject<Blog>"
],
"NodeName": "BlogPO",
"Extend": "",
"Type": "CLASS",
"FilePath": "",
"InOutProperties": [],
"Functions": [
{
"IsConstructor": false,
"InnerFunctions": [],
"Position": {
"StartLine": 6,
"StartLinePosition": 133,
"StopLine": 8,
"StopLinePosition": 145
},
"Package": "",
"Name": "toDomainModel",
"MultipleReturns": [],
"Annotations": [
{
"Name": "Override",
"KeyValues": []
}
],
"Extension": {},
"Override": false,
"extensionMap": {},
"Parameters": [],
"InnerStructures": [],
"ReturnType": "Blog",
"Modifiers": [],
"FunctionCalls": []
}
],
"Annotations": [],
"Extension": {},
"Parameters": [],
"Fields": []
}
``` **Развитие**
Правила синтаксического анализа:
1. имя пакета;
2. имя импорта;
3. класс или структура данных:
* имя структуры;
* параметры структуры;
* имя функции;
* типы возврата;
* параметры функции;
4. функция:
* имя функции;
* типы возврата;
* параметры функции;
5. вызов метода:
* вызов нового экземпляра;
* вызов параметра;
* вызов поля.
### Построение грамматики Antlr
1. настройка Antlr: `brew install antlr`;
2. запуск компиляции: `./scripts/compile-antlr.sh`.
### Структуры данных
// для анализа нескольких проектов code_project code_module
// для анализа зависимостей пакетов code_package_info code_dependency
// пакет или файл как анализ зависимостей code_package code_container
// класс-первый или функция-первый code_data_struct code_function
// детали функции или класса code_annotation code_field code_import code_member code_position code_property
// информация о вызове метода code_call
**Развитие (китайская версия)**
Подготовка среды: Intellij IDEA, JDK 11+.
1. Клонировать код: `git clone https://github.com/phodal/chapi`.
2. Выполнить сборку: `./gradlew build`.
### Участие в разработке
Чтобы гарантировать, что ошибки не возникнут, проект использует подход TDD, то есть сначала пишется соответствующий синтаксический тест, а затем реализуется код. Благодаря максимально возможному покрытию тестами снижается вероятность возникновения ошибок.
Проект в основном состоит из домена + AST различных языков + приложения:
— домен, построение унифицированной модели кода;
— AST различных языков;
— приложение, предоставляющее простой API для внешнего использования.
Входом каждого проекта AST является `xxAnalyser`, который возвращает CodeContainer, то есть контейнер кода. В языках, отличных от C#, это эквивалентно CodeFile, то есть файлу кода.
Соответствующая модель предметной области в CodeContainer выглядит следующим образом:
// class-first или function-first code_data_struct // класс, struct, интерфейс и т. д. code_function // функция. Если это язык с функциями первого класса («first-class function»), он будет использовать NodeName = «default» и будет упакован в модель code_data_struct.
// function или class detail code_annotation // аннотация code_field // глобальная переменная code_import // зависимость пакета code_member // зарезервированное поле code_position // информация о местоположении code_property // связанная с параметрами
// method call information code_call // вызов функции, например fmt.Println
### Присоединение к разработке
1. Найдите интересующий вас язык / добавьте новый языковой AST.
Реализуйте следующие функции с помощью подхода TDD (можно рассмотреть их реализацию в указанном порядке), см. пример в [JavaFullIdentListenerTest.kt](https://github.com/phodal/chapi/blob/master/chapi-ast-java/src/test/kotlin/chapi/ast/javaast/JavaFullIdentListenerTest.kt):
1. имя пакета;
2. имя импорта;
3. класс / структура данных:
* имя структуры;
* параметры структуры;
* имя функции;
* типы возврата;
* параметры функции;
4. функция:
* имя функции;
* типы возврата;
* параметры функции;
5. вызов метода:
* вызов нового экземпляра;
* вызов параметра;
* вызов поля;
* другие вызовы...
### Формат сообщения о фиксации
Для публикации используется стандартный CHANGELOG.md:
`<type>: <message>`, например: `feat: <grammars> init python & go grammars Phodal Huang 2020/2/2, 5:01 PM`.
Все типы:
* build: изменения, влияющие на систему сборки или внешние зависимости (пример диапазона: gulp, broccoli, npm);
* ci: изменения в наших файлах и сценариях непрерывной интеграции (пример диапазона: Travis, Circle, BrowserStack, SauceLabs);
* docs: только изменения документации;
* feat: новая функция;
* fix: исправление ошибки;
* perf: улучшение производительности кода;
* refactor: изменение кода, которое не исправляет ошибку и не добавляет функцию;
* style: изменения, которые не влияют на значение кода (пробел, форматирование, отсутствие точки с запятой и т.д.);
* test: добавление отсутствующего теста или исправление существующего теста.
Refs
---
Цель: модель данных исходного кода для разных языков и разных языковых семейств из [Language support](https://en.wikipedia.org/wiki/First-class_function).
Лицензия
---
[](http://ideas.phodal.com/)
@ 2020 Идея [Phodal Huang](https://www.phodal.com). Этот код распространяется под лицензией MPL. См. `LICENSE` в этом каталоге.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )