ANTLR (field=value), как выразить это?

Делали это годами. Никогда не сталкивайтесь с проблемой.

Я обычно настраиваю свои БД на одну таблицу, которая содержит все ключи, даты изменения и тому подобное. Никогда не сталкивался с проблемой дублирования ключей.

Единственный недостаток, который у него есть, это когда вы пишете несколько запросов для быстрого поиска информации, вы много копируете и вставляете ключи. У вас нет коротких, легко запоминающихся идентификаторов.

1
задан Mauli 24 June 2009 в 08:59
поделиться

2 ответа

Если поля и значения являются идентификаторами, где идентификатор представляет собой непустую строку буквенных символов (позволяющую значение быть пустым, как в вашем примере), вы можете сделать что-то вроде:

term    :       '(' NOT? field '=' value ')';

field : IDENTIFIER ;

value : IDENTIFIER? ;

// lexer
IDENTIFIER : ALPHA+ ;

fragment ALPHA
    :   ('a'..'z' | 'A'..'Z');

Поскольку лексер не может отличить поле от значения, вам нужно позволить лексеру обрабатывать их одинаково и использовать синтаксический анализатор, чтобы определять разницу в зависимости от контекста.

0
ответ дан 3 September 2019 в 01:15
поделиться

Okay, you are on the right track here. Just a few things you need to change. You will have to express the field name and field value in the parser rather than in the lexer, since the lexer has no way to tell the difference between these two. Having multiple Lexer expressions that use the same fragment makes it very hard (impossible!) for the Lexer to determine which one of these you want. Moving the determination of these two (name and value) to the parser makes it very easy. To make the value optional, just make that parser term optional (with the '?' behind it). See below for the parse tree produced with the modified grammar (hopefully this is what you were after). I have also pasted the modified grammar at the bottom of my answer for you.
alt text http://img268.imageshack.us/img268/7374/graphw.png

grammar FilterExpression;

options
{
    language=Java;
    k=2;
}

tokens
{
    NOT='!';
}

term    :       '(' NOT? field '=' value? ')';
// lexer
field   :       ID;
value   :       ID;

ID  :   ALPHA+
    ;

fragment ALPHA
    :   ('a'..'z' | 'A'..'Z');
2
ответ дан 3 September 2019 в 01:15
поделиться
Другие вопросы по тегам:

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