2016-02-04 2 views
0

Я хочу создать грамматику, которая будет анализировать текстовый файл и создавать дерево уровней в соответствии с настраиваемыми «сегментаторами». Это то, что я создал до сих пор, это своего рода работа, но остановится, когда в начале текста появится «segmentor». Например, текст «и местоположение» не будет разбираться. Есть идеи?ANTLR-грамматика для многоуровневой текстовой сегментации

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

grammar DocSegmentor; 

@header { 
package segmentor.antlr; 
} 

// PARSER RULES 
levelOne: (levelTwo LEVEL1_SEG*)+ ; 

levelTwo: (levelThree+ LEVEL2_SEG?)+ ; 
levelThree: (levelFour+ LEVEL3_SEG?)+ ; 
levelFour: (levelFive+ LEVEL4_SEG?)+ ; 
levelFive: tokens; 

tokens: (DELIM | PAREN | TEXT | WS)+ ; 


// LEXER RULES 
LEVEL1_SEG : '\r'? '\n'| EOF ; 
LEVEL2_SEG : '.' ; 
LEVEL3_SEG : ',' ; 
LEVEL4_SEG : 'and' | 'or' ; 

DELIM : '`' | '"' | ';' | '/' | ':' | '’' | '‘' | '=' | '?' | '-' | '_'; 
PAREN : '(' | ')' | '[' | ']' | '{' | '}' ; 

TEXT : (('a'..'z') | ('A'..'Z') | ('0'..'9'))+ ; 
WS  : [ \t]+ ; 
+1

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

+0

Да, я думаю, это было бы очень полезно. У вас есть предложения по Java/Scala? – spyk

ответ

1

Я обязательно поеду с библиотекой комбинаторов синтаксиса Scala.

https://lihaoyi.github.io/fastparse/ https://github.com/scala/scala-parser-combinators

Это лишь два примера для библиотеки можно писать вручную с небольшим усилием и настроиться на то, что вам нужно. Я должен упомянуть, что вы должны пойти с Scalaz (https://github.com/scalaz/scalaz), если вы пишете монаршу синтаксического анализа самостоятельно.

+0

Спасибо за ваш ответ. Я определенно займусь этим. Однако вопрос для ANTLR сохраняется. – spyk

+0

@spyk Да, конечно. Это просто альтернатива тому, что вы пытаетесь. :) – bash0r

0

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

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

+0

Это справедливый момент, и это то, что я использовал до сих пор довольно успешно. Однако я хочу иметь возможность поддерживать более сложные конструкции, такие как вложенные скобки и другие языковые конструкции, но все вышло из-под контроля с ручной сложностью кода, поэтому я искал возможность перейти к синтаксическим анализаторам. – spyk

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