Как сопоставить необязательные теги открытия / закрытия в JavaCC? - PullRequest
4 голосов
/ 27 сентября 2010

Какой синтаксис 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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"]     >
}

Ответы [ 2 ]

5 голосов
/ 07 октября 2010

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

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

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

2 голосов
/ 07 октября 2010

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

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

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

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

Где boldstart () будет просто слепо выводить начальный тег, а boldend () - конечный тег.

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

...