Идентификатор правила терминала не соответствует допустимым значениям для идентификатора

Я пытаюсь определить правило, в котором один элемент является идеальным кандидатом для общего терминального правила ID. Когда я запускаю редактор для тестирования примера кода, правило ID не соответствует строке «ABC»:

Define : ABC : Holder_1 

Я получаю сообщение "Несоответствующий ввод "ABC", ожидающий RULE_ID".

Есть ли что-то в моей грамматике, противоречащее правилу ID, чтобы вызвать эту ошибку?

Это мой файл грамматики:

grammar com.testco.Test with org.eclipse.xtext.common.Terminals 
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate defwiz "http://www.testco.com/Test"

Define_Holder:
  'Definition' ':' holder_name=ID ':' holder_number=HOLDER_NUMBER (':' attribute=define_attr)? (':' pad=holder_pad)?
;

holder_pad:
  HEX
;

Type:
  TYPE_TERM ':' type_value=TYPE_VAL
;


//***************** TERMINALS *****************
terminal TYPE_TERM:
 'Type_' INT+
;  

terminal PROFILE:
  (PROFILE_ID)(PROFILE_ID)'.'(PROFILE_ID)(PROFILE_ID)
;

terminal HOLDER_NUMBER returns ecore:: EString:
  'Holder_' INT+; 

terminal HEX returns ecore:: EString :
  ('0'..'9'|'A'..'F')
;

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


//***************** ENUMS *****************
enum define_attr:
  BINARY='Binary' |
  SCRAMBLE='Scramble' |
  FORCESIZE='ForceSize' |
  FIXEDSIZE='FixedSize'
;

person A.R.    schedule 13.01.2012    source источник


Ответы (2)


Ваше правило PROFILE_ID скрывает правило ID почти во всех случаях (кроме символа подчеркивания).

person Sebastian Zarnekow    schedule 18.01.2012

Да, вполне вероятно, что лексер сканирует ABC как HEX терминал. Попробуйте определить последнее, например, следующим образом:

terminal HEX returns ecore:: EString :
 '0x' ('0'..'9'|'A'..'F')
;
person Eldar Abusalimov    schedule 14.01.2012
comment
Язык, который я пытаюсь смоделировать, не распознает префикс 0x, он ожидает, что заданное значение соответствует типу функции, которой оно передается (переменная не имеет типа). Конечно, это очень забавный язык. - person A.R.; 26.07.2012