2013-10-07 3 views
0

В Antlr Lexer, как я могу добиться разбора фишки, как это: «{»Antlr Лексер исключает определенную модель

Слова, которое содержит любое некосмическими письма, но не внутри него. Лучшее, что я могу придумать, - использовать предикат семантики.

WORD: WL+ {!getText().contains(".{")}; 
WL: ~[ \n\r\t]; 

Я немного волнуется, чтобы использовать семантику предикат, хотя причина WORD здесь будет lexed миллионов раз я думаю поставить семантику предикат ударит по производительности.

Это исходит из требования, что мне нужно, чтобы разобрать что-то вроде:

TOKEN_ONE.{TOKEN_TWO} 

в то время как TOKEN_ONE может включать в себя. и {в его письме.

Я использую Antlr 4.

+0

Я думаю, что ваш вопрос нуждается в более подробной информации. Я сделал ответ, несколько раз переработал его и удалил, потому что есть много крайних случаев, которые не были рассмотрены. Например, должен 'foo {} bar' действительно быть' СЛОВО'? Можно ли написать 'foo. {Бар} '? и т. д. – Darien

+0

yeah foo {} bar будет словом и foo. {bar}. Причина, по которой это происходит, заключается не в том, что я хочу обозначить их как слово любого смысла, они просто будут freetext, которые могут принимать любую букву, но. {Начнет другой вид токена. Я объясню больше в главном вопросе. – Wudong

+0

В зависимости от того, сколько изменений поведения происходит внутри разделов '. {}', Вы можете захотеть просмотреть [лексические режимы] (http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules). Таким образом, при вводе '. {' Вы можете переключиться на набор правил lexer, которые больше не распознают '}' как допустимый символ слова. (В противном случае 'foo. {Bar} baz' может быть интерпретирован как' foo', '. {', 'Bar} baz'.) – Darien

ответ

-1

Как насчет перефразировать ваш вопрос к эквивалентному «слову содержит любой символ, кроме пробела или точек или левого раскоса кронштейна.»

Тогда правило лексер просто:

WORD: ~[ \n\r\t.{]* 
0

Вы должны ограничить свою оценку предиката в случае сразу после . на входе.

WORD 
    : (~[. \t\r\n] 
    | '.' {_input.LA(1)!='{'}? 
    )+ 
    ; 
+0

спасибо, я попробую это, похоже, чего я хочу достичь. – Wudong

+0

У меня была попытка с этим, но, как ни странно, это выглядит так, как только предикат считается ложным, т. Е. An. {Встретился, предикат уже не оценивается! любая идея почему? – Wudong

+0

Я формализовал проблему, с которой я столкнулся в вопросе: http://stackoverflow.com/questions/19283151/antlr-lexer-semantic-predicate-on-an-alternative Можете ли вы, пожалуйста, посмотреть? большое спасибо. – Wudong

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