Парсинг Mediawiki в ANTLR: обработка токенов

Я пытаюсь написать грамматику для разбора синтаксиса Media Wiki, и после этого креольский синтаксис (к сожалению, существующая креольская грамматика не работает в Antlr 3).

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

'' this text is bold '''now it's italic''' and just bold again''

Мне очень помог этот вопрос но я застрял. Цель состоит в том, чтобы создать HTML внутри грамматики с помощью действий или, возможно, AST — я пока не уверен, что лучше.


person Chris S    schedule 26.03.2011    source источник


Ответы (1)


В качестве упражнения я также создал синтаксический анализатор MediaWiki и не сопоставлял открывающие и закрывающие теги для полужирного и курсивного начертания, а вместо этого вызывал такой переключатель:

grammar MediaWiki;

options {
  output=AST;
  backtrack=true;
  memoize=true;
}

...

// entry point of the parser
parse
  :  atom+ EOF -> ^(ROOT atom+)
  ;

atom
  :  formatToggle
  |  horizontalRule
  |  header
  |  link
  |  list
  |  preFormattedText
  |  table
  |  ...
  |  any
  ;

formatToggle
  :  SQt SQt SQt SQt SQt -> BOLD_ITALIC
  |  SQt SQt SQt         -> BOLD
  |  SQt SQt             -> ITALIC
  ;

...

SQt
  :  '\''
  ; 

И затем во время перевода формата MediaWiki (в HTML?) вы продолжаете переключать некоторые логические флаги, когда встречаете один из BOLD_ITALIC, BOLD или ITALIC.

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

Удачи!

person Bart Kiers    schedule 27.03.2011
comment
Спасибо - вы что-нибудь поняли с грамматикой медиавики? Я начинаю думать, что даже синтаксический анализатор Antlr LL(*) не справится с его плохим дизайном токенов, и я должен просто перевести его на креольский язык с некоторой заменой строки и вместо этого построить для этого грамматику. - person Chris S; 27.03.2011
comment
@ Крис, да, я почти закончил с этим. Но тут так много неясностей, что я включил глобальный возврат (и для повышения производительности включил запоминание). Из-за этого ANTLR требуется около 20 секунд для создания лексера и синтаксического анализатора, и мне придется увеличить пространство кучи до 256 МБ. Конечно, мне не нужно так много оперативной памяти при разборе настоящих вики-источников, только для создания лексера и парсера требуется довольно много места в куче. Удачи! - person Bart Kiers; 27.03.2011
comment
Похоже, ANTLR не является жизнеспособным решением для вики-движка (или любого другого, такого как парсер Gold/Grammatica, но они ломаются из-за недопустимой разметки) - person Chris S; 27.03.2011
comment
@ Крис, я согласен, один синтаксический анализатор / грамматика не идеален. Но, как я предложил в посте, на который вы ссылаетесь, я думаю, что это можно сделать с помощью нескольких парсеров, для которых вы могли бы использовать ANTLR (но я сам этого не делал). - person Bart Kiers; 27.03.2011