2015-12-16 2 views
0

Я пишу переводчик, который преобразует DSL на несколько языков программирования (похоже, Apache Thrift).Как проверить синтаксис SQL, Language в String во время компиляции (Scala)

Например,

// an example DSL 
LOG_TYPE: COMMERCE 

COMMON_FIELD : session_id 

KEY: buy 
FIELD: item_id, transaction_id 

KEY: add_to_cart 
FIELD: item_id 

// will be converted to Java 
class Commerce { 
    private String session_id 
    private String key; 
    private String item_id; 
    private String transaction_id 

    // auto-created setter, getter, helper methods 
    ... 
} 

Оно также должно быть переведено на Objective-C и JavaScript.

Чтобы осуществить это, я должен Заменить строку

// 1. create or load code fragments 
String variableDeclarationInJava = "private String {$field};"; 
String variableDeclarationInJavascript = "..."; 
String variableDeclarationInObjC = "..."; 

// 2. replace it 
variableDeclarationInJava.replace(pattern, fieldName) 
... 

Замена фрагмента кода в строки не типобезопасен и разочарование, так как это не какой-либо информации, даже в случае возникновения ошибок.

Итак, мой вопрос: Можно ли разобрать String во время компиляции?Scala sqltyped library

Если возможно, я хотел бы знать, как я могу его достичь.

Спасибо.

+0

Вряд ли можно проверить синтаксис SQL во время компиляции, так как это зависит от поставщика БД. Могут использовать макро- и/или строчную интерполяцию для проверки синтаксиса строк. – cchantep

+0

В моем случае это было бы проще, чем проверка синтаксиса SQL, поскольку я должен проверить ** ограниченный синтаксис языка (например, создание функции, класс, переменные ..) Не могли бы вы порекомендовать какой-нибудь полезный ресурс для макроса для перевода DSL? – 1ambda

+0

Существуют различные существующие открытые проекты (например, Slick). Вы можете посмотреть источники. – cchantep

ответ

2

Насколько я понимаю, это может быть так. Пожалуйста, взгляните на интерполяцию строк. Вы реализуете пользовательский интерполятор (как это делалось для квазициклингов или в Slick).

Хороший пример, что вы можете захотеть сделать это here

+0

Спасибо @ppopoff :) Я посмотрю * интерполяция строк * – 1ambda