2015-09-09 14 views
5

Ich versuche, eine Grammatik für das folgende Beispiel csv zu finden:Probleme eine csv Grammatik zu finden, wo Zellen haben eine besondere Bedeutung

a; test;test ; 
;a; test;test ; 
<ignore>; <ignore> ;test 
a; <ignore> test;test 
a; this is test ;test 

Das Semikolon als Trennzeichen verwendet wird. Zellen, die nur den Text <ignore> enthalten, haben eine besondere Bedeutung und sollten im EMF-Modell durch einen eigenen Typ dargestellt werden. <igonore> test ist jedoch kein solcher besonderer Wert. Die Leerzeichen um Semikolons müssen ignoriert werden. Zellen dürfen beliebige Zeichen außer dem Semikolon enthalten.

Bisher habe ich mit dieser Grammatik kommen:

grammar com.example.Csv 

import "http://www.eclipse.org/emf/2002/Ecore" as ecore 
generate impEx "http://www.example.com/Csv 

Model: 
    valueLine=ValueLine 

ValueLine: 
    ';'? WHITE_SPACE values+=Value WHITE_SPACE (';' WHITE_SPACE values+=Value WHITE_SPACE)* ';'*; 

Value: 
    ((=>'<ignore>') {IGNORE_VALUE} IGNORE_VALUE) | text=TEXT_VALUE; 

terminal TEXT_VALUE: 
    (!';')*; 

IGNORE_VALUE: 
    '<ignore>'; 

WHITE_SPACE: 
    (' '|'\t')*; 

Aber mein Testfall mit

@InjectWith(CsvInjectorProvider.class) 
@RunWith(XtextRunner.class) 
public class ParserTest { 

    @Inject 
    private ParseHelper<Model> parser; 

    @Test 
    public void parseDomainmodel() throws Exception { 
     Model parsed = parser.parse("abc; <ignore>; <ignore> \t; <ignore> a;def"); 
     System.out.println(parsed.getValueLine().getValues()); 
    } 
} 

Ich sehe, dass die IGNORE_VALUE Regel nicht <ignore> überein. Der Parser scheint die TEXT_VALUE-Regel für den Start-Whitespace zu verwenden.

Was muss ich tun, um die <ignore> Werte richtig zu analysieren?

Antwort

0

Das Problem hier ist, dass der Lexer eine längste Übereinstimmung durchführt. Und da Ihr TEXT-Terminal praktisch alles zusammenbringt, wird es ausgewählt.

Ich würde vorschlagen, nur Textspalten zu haben und die Analyse von "wird diese Spalte ignoriert?" in den späteren Phasen wie Validierung und Hervorhebung.

0

Ich sehe Sie mit regulären Ausdrücken handelt die unten in der Grammatikdatei versuchen:

IGNORE_VALUE: 
    '\<ignore\>'; 

, wenn Sie mit Leerzeichen beschäftigen sollte es so etwas wie sein:

IGNORE_VALUE: 
    '\ *\<ignore\>'; 

Hoffentlich hilft.