Question

J'ai cette grammaire lalr (fonctionnelle) pour SABLECC:

Package org.univpm.grail.sable;

Helpers
    digit = [ '0' .. '9' ];
    letter = [ [ 'a' .. 'z' ] + [ 'A' .. 'Z' ] ];
    any_character = [ 0 .. 0xfffff ] ;

States
    normal, complex;

Tokens
    newline = ( 13 | 10 | 13 10 ) ; 
    blank = 32+ ;
    dot = '.' ;
    comma = ',' ;
    element = 'v' | 'V' | 'e' | 'E' | 'all' | 'ALL' ;
    cop = '>' | '<' | '>=' | '<=' | 'like' | 'LIKE' | '==' | '!=' ;
    number = digit+ | digit+ '.' digit digit? ;
    l_par = '(' ;
    r_par = ')' ;
    logic_and = 'and' | 'AND' ;
    logic_or = 'or' | 'OR' ;
    logic_not = 'not' | 'NOT' ;
    id = ( 95 | letter ) ( letter | digit )+ ;
    line_comment = '/' '/' [ any_character - [ 10 + 13 ] ]* ( 13 | 10 | 10 13 ) ;
    string = '"' letter* '"' ;

Ignored Tokens
    blank;

Productions
    phrase =
        {instruction} instr |
        {complex_instruction} instr newline+ phrase? ;

    instr = command query ;

    command =
        {identifier} id |
        {complex_identifier} id l_par parlist r_par ;

    parlist = 
        {complex_parlist} par comma parlist |
        {simple_parlist} par ;

    par = 
        {numero} number | 
        {stringa} string |
        {idpar} id ;

    query = 
        {query_or} query logic_or term | 
        {query_term} term ;

    term =
        {term_and} term logic_and factor |
        {term_factor} factor ;

    factor = 
        {atop} attroperator |
        {query_not} logic_not attroperator |
        {query_par} l_par query r_par ;

    attroperator =
        {simple_element} element |
        {complex_element} element dot id cop par ;

J'essayais de le convertir pour XText qui utilise Antlr (LL Parser Generator). J'ai du mal à convertir ces deux règles de restriction à gauche:

query = 
    {query_or} query logic_or term | 
    {query_term} term ;

term =
    {term_and} term logic_and factor |
    {term_factor} factor ;

Comment dois-je le faire? Je pense que je devrais travailler avec la priorité de l'opérateur mais rigth maintenant je ne peux pas penser dans un Ll way.

Était-ce utile?

La solution

Eh bien, je l'ai finalement fait avec ce guide:

http://javadude.com/articles/lalrtoll.html

Je devais résoudre Récursion gauche

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top