2010-09-27 1 views
4

Что синтаксис JavaCC делает реализацию грамматики, которая может анализировать такого рода линию:Как сопоставить дополнительные теги open/close в JavaCC?

[b]content[/b] 
content[/b] 
[b]content 

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

Правильные метки похожи на 1-ю строчку, у них есть открытая и закрытая метка. Когда теги совпадают, это приведет к получению жирного форматированного текста.

Неверные метки похожи на строки 2 и 3, они не имеют соответствующего открытого или закрытого тега. Когда они происходят, они записываются на выход как есть и не будут интерпретироваться как теги.

Я пробовал код JavaCC ниже (LOOKAHEAD = 999999). Проблема в том, что этот синтаксис будет всегда соответствует всем как invalidTag() вместо bold(). Как я могу убедиться, что парсер JavaCC будет соответствовать bold() когда это возможно?

String parse() : 
{} 
{ 
    body() <EOF> 
    { return buffer; } 
} 

void body() : 
{} 
{ 
    (content())* 
} 

void content() : 
{} 
{ 
    (text()|bold()|invalidTag) 
} 

void bold() : 
{} 
{ 
    { buffer += "<b>"; } 
    <BOLDSTART>(content())*<BOLDEND> 
    { buffer += "</b>"; } 
} 

void invalidTag() : 
{ 
} 
{ 
    <BOLDSTART> | <BOLDEND> 
    { // todo: just output token 
    } 
} 

TOKEN : 
{ 
    <TEXT : (<LETTER>|<DIGIT>|<PUNCT>|<OTHER>)+ > 
    |<BOLDSTART : "[b]" > 
    |<BOLDEND : "[/b]" > 

    |<LETTER : ["a"-"z","A"-"Z"] > 
    |<DIGIT : ["0"-"9"] > 
    |<PUNCT : [".", ":", ",", ";", "\t", "!", "?", " "] > 
    |<OTHER : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"]  > 
} 
+0

* Видит BBCode * ... * [Pukes] (http://stackoverflow.com/questions/3788959/regex-to-split-bbcode-into-pieces/3792262#3792262) * – NullUserException

+0

@NullUserException: Doesn ' я работаю для меня, мне нужно разобрать все возможные типы разметки BBCode, которые люди могут ввести. – Kdeveloper

ответ

5

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

Парсер LL (k), вероятно, не лучший инструмент для этой работы.

Однако токенизатор может быть полезен, и использование стека для поиска совпадающих и развязывающих пар меток может быть подходящей альтернативой.

+0

Я пришел к такому же выводу, но я нахожу JavaCC немного излишним для просто токенизатора. Вы знаете о 100% -ном токенизаторе Java? (Так что мне не нужны дополнительные инструменты для сборки?) – Kdeveloper

2

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

Примечание: Я не слишком хорошо знаком с JavaCC, но я работал с несколькими генераторами компилятора в прошлом (мой любимый - sablecc).

Вы могли бы просто определить свой «контент», как-то вроде этого:

(text()|boldstart()|boldend()|invalidTag) 

Где BOLDSTART() будет просто слепо выход открывающий тег и BOLDEND() - конечный тег.

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

+0

Спасибо, у вас есть ссылка слишком примеров на этом? Или знаете инструмент Java-токенизатора? – Kdeveloper

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

  • Нет связанных вопросов^_^