Проблемы с сопоставлением текста и содержанием элементов синтаксиса

Я написал небольшую часть комбинированной грамматики ANTLR4:

grammar TestCombined;

NL
    : [\r\n]
    ;

SUBHEADLINE
    : '##' .*? '##'
    ;

HEADLINE
    : '#' .*? '#'
    ;

LEAD
    : '###' .*? '###'
    ;

SUBHEADING
    : '####' .*? '####'
    ;

TEXT
    : .+?
    ;

/* ---- */

dnpMD
    : subheadline headline lead bodyElements*
    ;

subheadline
    : SUBHEADLINE NL NL
    ;

headline
    : HEADLINE NL NL
    ;

lead
    : LEAD NL NL
    ;

subheading
    : SUBHEADING
    ;

bodyElements
    : TEXT
    | subheading
    ;

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

Но у меня проблемы с пониманием, почему правило/токен TEXT не сопоставляется правильно. Я новичок в ANTLR4 и думаю, что упускаю что-то очень важное, что мешает мне понять основную проблему.

Это пример ввода:

## Test ##

# Test123 #

### Test1234 ###

#### Another Test ####

this is not getting recognized.

Что мне не хватает? Неужели невозможно написать эти вещи в/с ANTLR4? Текст может содержать больше элементов синтаксиса, таких как курсив и тому подобное.


person FDeitelhoff    schedule 03.06.2016    source источник
comment
Несколько дней назад я разместил аналогичный вопрос с такой проблемой, как эта здесь. stackoverflow.com/questions/37497247/   -  person FDeitelhoff    schedule 03.06.2016


Ответы (1)


Текущее решение выглядит следующим образом: лексер и правила грамматики:

lexer grammar dnpMDAuslagernLexer;

/*@members {
    public static final int COMMENTS = 1;
}*/

NL
    : [\r\n]
    ;

SUBHEADLINE
    : '##' (~[\r\n])+? '##'
    ;

HEADLINE
    : '#' ('\\#'|~[\r\n])+? '#'
    ;

LEAD
    : '###' (~[\r\n])+? '###'
    ;

SUBHEADING
    : '####' (~[\r\n])+? '####'
    ;

CAPTION
    : '#####' (~[\r\n])+? '#####'
    ;

LISTING
    : '~~~~~' .+? '~~~~~'
    ;

ELEMENTPATH
    : '[[[[[' (~[\r\n])+? ']]]]]'
    ;

LABELREF
    : '{##' (~[\r\n])+? '##}'
    ;

LABEL
    : '{#' (~[\r\n])+? '#}'
    ;

ITALIC
    : '*' (~[\r\n])+? '*'
    ;

SINGLE_COMMENT
    : '//' (~[\r\n])+ -> channel(1)
    ;

MULTI_COMMENT
    : '/*' .*? '*/' -> channel(1)
    ;

STAR
    : '*'
    ;

BRACE_OPEN
    : '{'
    ;

TEXT
    : (~[\r\n*{])+
    ;

parser grammar dnpMDAuslagernParser;

options { tokenVocab=dnpMDAuslagernLexer; }

dnpMD
    : head body
    ;

head
    : subheadline headline lead
    ;

subheadline
    : SUBHEADLINE NL+
    ;

headline
    : HEADLINE NL+
    ;

lead
    : LEAD
    ;

subheading
    : SUBHEADING
    ;

caption
    : CAPTION
    ;

listing
    : LISTING (NL listingPath)? (NL label)? NL caption
    ;

image
    : caption (NL label)? (NL imagePath)?
    ;

listingPath
    : ELEMENTPATH
    ;

imagePath
    : ELEMENTPATH
    ;

labelRef
    : LABELREF
    ;

label
    : LABEL
    ;

italic
    : ITALIC
    ;

singleComment
    : SINGLE_COMMENT
    ;

multiComment
    : MULTI_COMMENT
    ;

paragraph
    : TEXT? italic TEXT?
    | TEXT? STAR TEXT?
    | TEXT? labelRef TEXT?
    | TEXT? BRACE_OPEN TEXT?
    | TEXT? LABEL TEXT?
    | ELEMENTPATH
    | TEXT
    ;

newlines
    : NL+
    ;

body
    : bodyElements+
    ;

bodyElements
    : singleComment
    | multiComment
    | paragraph
    | subheading
    | listing
    | image
    | newlines
    ;

Этот язык работает нормально, и, возможно, кто-то может извлечь из этого пользу.

Спасибо всем, кто помог! Фабиан

person FDeitelhoff    schedule 07.06.2016