2016-01-22 4 views
0

Я пытаюсь разобрать ms sql, что позволяет заключить в скобки многие вещи. Например, вы можете скопировать имена столбцов, имена таблиц, временные таблицы и типы данных.разбор в квадратных скобках в ms sql

Это может принимать любые формы, как следующее:

select [#col1], [key], [case], [select], from [mytable] 
CREATE TABLE MyTable ([MyCol] [varchar](50) NULL) 

Проблема я бегу в том, что если я ставлю «в квадратные скобки идентификатор» в мое определение лексического анализатора, то мой анализатор будет видеть лексемы, как [Mycol ] и [varchar]. [varchar] не является типом данных, о котором знает мой парсер, но varchar. Моя грамматика не может справиться с сложностью работы с некоторыми заключенными в квадратные скобки маркерами и некоторыми неблокируемыми маркерами.

С другой стороны, если я возьму логику брекетинга из своего лексера и поместил ее в свой синтаксический анализатор, тогда я не смогу разобрать имена столбцов, которые содержат ключевые слова sql. ex:

select [key], [special case] from MyTable 

Если это имеет значение, я генерирую код C# из этого, а не код Java.

Как я должен справиться с этим?

ответ

1

Выполнение этого в парсере - лучший подход. Чтобы правильно работать с ключевыми словами в качестве идентификатора, вам нужно будет добавить все допустимые ключевые слова в правило идентификатора парсера, аналогично тому, что я сделал в моем MySQL grammar.

0

См. this tsql grammar для ANTLR4. Существует SQUARE_BRACKET_ID: '[' ~']'+ ']'; и rule id:

id 
    : simple_id 
    | DOUBLE_QUOTE_ID 
    | SQUARE_BRACKET_ID 
    ; 

, который может обрабатывать SQUARE_BRACKET_ID идентификаторы.

Смежные вопросы