2016-06-03 8 views
-1

ich einen kleinen Teil eines kombinierten ANTLR4 Grammatik geschrieben haben:Probleme Text enthalten und enthält Syntaxelemente

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 
    ; 

Die ersten drei Schlagzeile Typen sind extrem gut funktioniert. Dank einer anderen Frage (und der Antwort) ist dies für mich viel klarer als zuvor.

Aber ich habe Probleme zu verstehen, warum die TEXT-Regel/Token nicht richtig zugeordnet wird. Ich bin neu bei ANTLR4 und ich denke, dass mir etwas sehr Wichtiges fehlt, das mich daran hindert, das zugrunde liegende Problem zu verstehen.

Dies ist ein Beispiel Eingabe:

## Test ## 

# Test123 # 

### Test1234 ### 

#### Another Test #### 

this is not getting recognized. 

Was bin ich? Ist es unmöglich, diese Dinge in/mit ANTLR4 zu schreiben? Der Text könnte möglicherweise mehr Syntaxelemente wie italic und solche Sachen enthalten.

+1

Ich habe eine ähnliche Frage vor ein paar Tagen mit einem Problem wie diesem hier gepostet. http://stackoverflow.com/questions/37497247/html-markdown-style-grammar-for-antlr4 – FDeitelhoff

Antwort

0

Die aktuelle Lösung sieht wie folgt aus Lexer und Grammatikregeln:

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 
    ; 

Diese Sprache funktioniert gut und vielleicht kann jemand davon profitieren.

Vielen Dank an alle, die geholfen haben! Fabian

Verwandte Themen