Antlr - Frage



  • Ich versuche mich gerade in Antlr einzuarbeiten. Ich betrachte gerade das CSV-Beispiel

    grammar CSV;
    
    file: hdr row+ ;
    hdr : row ;
    
    row : field (',' field)* '\r'? '\n' ;
    
    field
        : TEXT
        | STRING
        |
        ;
    
    TEXT   : ~[,\n\r"]+ ;
    STRING : '"' ('""'|~'"')* '"' ;
    

    Ist es möglich, in der Grammatik zu definieren, dass alle rows die selbe Anzahl an Spalten wie der hdr haben müssen?

    Für meinen Anwendungsfall bräuchte ich einen vergleichbaren Mechanismus.
    Ich würde gerne eine Art Array und dessen Größe angeben und dann alle Werte danach, so in der Art:

    // example-Input I want to parse
    A = 3
    a_0 = 2
    a_1 = 5        // es muss genau A viele a_ Einträge geben
    a_2 = 3
    

    Kann ich das schon in der Grammatik definieren oder geht dass irgendwo während des Tree-Walks?

    Oder ist ein LL-Parser eventuell das falsche Tool? (Ich habe nur gelesen, dass LR-Parser mächtiger wären)



  • Bin mir ziemlich sicher, dass das nicht geht, damit beschreibst du kontextfreie Grammatiken. Meine Theorie reicht jetzt aber nicht mehr aus, um das genau zu begründen.
    Der Parser wär jetzt auch nicht unbedingt die richtige Stelle das zu prüfen, das kann man doch ganz einfach im nächsten Schritt nach dem Parsen machen.



  • das macht man am besten erst danach, also wenn der Syntaxbaum erstellt wurde.
    Der Parser prüft nur ob die Struktur passt - prüft aber keine kontextbezogenen Dinge.

    Bau also den Baum, gehe den Baum durch und prüfe wieviele Einträge der Header hat, und dann prüfe ob jede Zeile die richtige Anzahl an Spalten hat.


Anmelden zum Antworten