Erro - Acção em regra lexer 'xxxx' deve ser o último elemento da alt externa única

votos
2

Quando I actualizado a partir do Antlr 3 a Antlr 4, eu removidos todos os predicados sintáticos na gramática. Mas quando eu mudei, eu estou recebendo um erro como mencionado no título.

Este é o código alterado

NUMBER 
    :(
      '0'..'9' ('.' '0'..'9'+)?
    | '.' '0'..'9'+
    )
    (
        E
        (
              M     { $type = EMS;          }
            | X     { $type = EXS;          }
        )
    |   P
        (
              X     
            | T
            | C
        )
                    { $type = LENGTH;       }   
    |   C M         { $type = LENGTH;       }
    |   M
        (
              M     { $type = LENGTH;       }

            | S     { $type = TIME;         }
        )
    |   I N         { $type = LENGTH;       }

    |   D E G       { $type = ANGLE;        }
    |   R A D       { $type = ANGLE;        }

    |   S           { $type = TIME;         }

    |   K? H    Z   { $type = FREQ;         }

    | IDENT         { $type = DIMENSION;    }

    | '%'           { $type = PERCENTAGE;   }

    | // Just a number
    )
;

Este é o erro que eu estou recebendo. digite

Eu vi uma resposta para esta pergunta here. Mas eu era incapaz de compreender o que significava. Por favor me dê alguma orientação.

EDITAR:

Mesmo erro aparece aqui na gramática.

    fragment    INVALID :;
     STRING          : '\'' ( ~('\n'|'\r'|'\f'|'\'') )* 
                    (

                            '\''
                            | { $type = INVALID;   }
                    )

                | '' ( ~('\n'|'\r'|'\f'|'') )*
                    (
                         ''
                        | { $type = INVALID;   }
                    )
                ;

Eu era incapaz de mudar isso para ANTLR 4. O que é novo neste código? Por favor me dê uma solução rápida para isso.

Publicado 27/08/2013 em 04:29
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Sua NUMBERregra foi fortemente manualmente esquerda consignado. Na realidade, é uma única regra lexer que produz 9 diferentes tipos de token. A-factoring esquerda foi realizada provavelmente devido à maneira ANTLR 3 lexers utilizar a previsão com um analisador de descida recursiva. ANTLR 4 usa um completamente algoritmo lexer diferente com base em DFAs. O erro que você vê é o resultado dessa mudança - desde ANTLR 4 lexers há mais recursiva-descida analisadores, eles não têm mais a capacidade de executar código de ação em pontos arbitrários.

A maneira mais eficaz para escrever a regra acima em ANTLR 4 é usar a sintaxe "ineficiente" do ANTLR 3. No ANTLR 4, não será lenta.

EMS
    : NUMBER E M
    ;
EXS
    : NUMBER E X
    ;
LENGTH
    : NUMBER P X
    | NUMBER P T
    | NUMBER P C
    | NUMBER C M
    | NUMBER M M
    | NUMBER I N
    ;
TIME
    : NUMBER M S
    | NUMBER S
    ;
ANGLE
    : NUMBER D E G
    | NUMBER R A D
    ;
FREQ
    : NUMBER K? H Z
    ;
DIMENSION
    : NUMBER IDENT
    ;
PERCENTAGE
    : NUMBER '%'
    ;
NUMBER
    : [0-9] ('.' [0-9]+)?
    | '.' [0-9]+
    ;
Respondeu 27/08/2013 em 05:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more