Правило не признается

Я написал грамматику, которая должна позволять мне определять переменные и массивы. Все работало нормально, пока я не разделил переменные на локальные и глобальные переменные. Теперь мой парсер больше не распознает массивы (он говорит, что это будет переменная и дает мне синтаксические ошибки для этого).

Моя грамматика:

grammar sqf.Sqf with org.eclipse.xtext.common.Terminals

generate sqf "http://www.Sqf.sqf" 

Model:
    elements += Element*
;

    Element:
        Declaration ";" | Command ";"
    ;

        Declaration:
            Array | Variable
        ;

            Variable:
                LocalVariable | GlobalVariable
            ;

            LocalVariable:
                name=LOCALVARNAME "=" content=VARCONTENT (("+"|"-"|"*"|"/") content2+=VARCONTENT)*
            ;

            GlobalVariable:
                name=GLOBALVARNAME "=" content=VARCONTENT (("+"|"-"|"*"|"/") content2+=VARCONTENT)*
            ;


            Array:
                name=ID "=" content=ArrayLiteral | name=ID "=" "+" content2=[Array]
            ;

                ArrayLiteral:
                    "[" (content += ArrayContent)* "]" (("+"|"-")content1+=Extension)*
                ;

                    ArrayContent:
                        content01=Acontent ("," content02+=Acontent)*
                    ;

                        Acontent:
                            STRING | DOUBLE | ArrayLiteral
                        ;

                    Extension:
                        STRING | DOUBLE
                    ;




    Command:
        Interaction
    ;

        Interaction:
            hint
        ;

            hint:
                Normal | Format | Special
            ;

                Normal:
                    name=("hint" | "hintC" | "hintCadet" | "hintSilent") content=STRING
                ;

                Format:
                    name=("hint" | "hintC" | "hintCadet" | "hintSilent") "format" "[" content=STRING "," variable=DECREF "]"
                ;

                Special:
                    hintCArray
                ;

                    hintCArray:
                        title=STRING "hintC" (content1=ArrayLiteral | content=STRING)
                    ;


VARCONTENT:
    STRING | DOUBLE | DECREF | "true" | "false" | "nil"
;

DOUBLE:
    INT ("."INT)?
;

DECREF:
    ref1=[Array|ID] | ref2=[LocalVariable|LOCALVARNAME] | ref3=[GlobalVariable|GLOBALVARNAME]
;

terminal LOCALVARNAME:
    "_" ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;

terminal GLOBALVARNAME:
    '^'?('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;

Кто-нибудь из вас знает, в чем проблема?
(Любые другие улучшения кода тоже приветствуются)
Встречает Krzmbrzl

1 ответ

Решение

Ваше правило GLOBALVARNAME полностью скрывает идентификатор правила. Вы можете просто использовать идентификатор вместо GLOBALVARNAME.

Другие вопросы по тегам