ANTLR - проблема с установкой иерархии AST

Я пытаюсь разобраться в операторах построения дерева (^ и!) В ANTLR.

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

Моя проблема связана с деревом, которое создается после анализа некоторых входных данных. Все, что происходит, - это то, что каждый персонаж является родственным узлом. Я ожидал, что сгенерированный AST будет похож на дерево, которое вы можете увидеть в окне интерпретатора ANTLRWorks 1.4. Как только я пытаюсь изменить способ создания дерева с помощью символа ^, я получаю исключение в виде формы:

Unhandled Exception: System.SystemException: more than one node as root (TODO: make exception hierarchy)

Вот грамматика (в настоящее время ориентированная на C #):

grammar FlexByteArray_HexGrammar;

options 
{
//language = 'Java';
language = 'CSharp2';
output=AST; 
}

expr 
    :   array_length remaining_data
        //the amount of remaining data must be equal to the array_length (times 2 since 2 hex characters per byte)
        // need to check if the array length is zero first to avoid checking $remaining_data.text (null reference) in that situation.
        //{ ($array_length.value == 0 && $remaining_data.text == null) || ($remaining_data.text != null && $array_length.value*2 == $remaining_data.text.Length) }?
    ;

array_length //returns [UInt16 value]
    :   uint16_little //{ $value = $uint16_little.value; }
    ;

hex_byte1 //needed just so I can distinguish between two bytes in a uint16 when doing a semantic predicate (or whatever you call it where I write in the target language in curly brackets)
    :   hex_byte
    ;

uint16_big //returns [UInt16 value]
    :   hex_byte1 hex_byte //{ $value = Convert.ToUInt16($hex_byte.text + $hex_byte1.text); }
    ;

uint16_little //returns [UInt16 value]
    :   hex_byte1 hex_byte //{ $value = Convert.ToUInt16($hex_byte1.text + $hex_byte.text); }
    ;

remaining_data 
    :   hex_byte*
    ;

hex_byte 
    :   HEX_DIGIT HEX_DIGIT
    ;

HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F')
;

Вот что, по моему мнению, будет в AST быть:

ANTLRWorks 1.4 interpreter output for input of "0001ff"

Здесь ' но есть ли способ проще / лучше / быстрее / сильнее ?

module FakeProfilePictures
  class Photo
    DIR = File.expand_path(File.join(File.dirname(__FILE__), "photos"))

    # ...

    def self.all_large_names_2x
      @@all_large_names_2x ||= Dir[File.join(DIR, "picture_*@2x.*")] # .map { |f| File.basename(f) }
    end
  end
end

8
задан PeeHaa 13 October 2012 в 12:50
поделиться