ANTLR: на входе нет жизнеспособной альтернативы

Извините за мой плохой английский.

Я написал грамматику ANTLR4 для команд вывода GDB/MI из это руководство:

grammar GdbOutput;

output : out_of_band_record | result_record | terminator_record;
result_record : TOKEN? '^' RESULT_CLASS (',' result)*;
out_of_band_record : async_record
    | stream_record;
async_record : exec_async_output
    | status_async_output
    | notify_async_output;
exec_async_output : TOKEN? '*' async_output;
status_async_output : TOKEN? '+' async_output;
notify_async_output : TOKEN? '=' async_output;
async_output : async_class (',' result)*;
RESULT_CLASS : 'done'
    | 'running'
    | 'connected'
    | 'error'
    | 'exit';
async_class : 'stopped'; //TODO
result : VARIABLE '=' value;
value : const
    | tuple
    | list;
const : c_string;
c_string : '"' STRING_LITERAL '"';
tuple : '{}'
    | '{' result (',' result)* '}';
list : '[]'
    | '[' value (',' value)* ']'
    | '[' result (',' result)* ']';
stream_record : console_stream_output
    | target_stream_output
    | log_stream_output;
console_stream_output : '~' c_string;
target_stream_output : '@' c_string;
log_stream_output : '&' c_string;
terminator_record : '(gdb)';

VARIABLE : [a-z-]*;
STRING_LITERAL : (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))*;
TOKEN : [0-9]+;

Я попробовал некоторые выходные строки из GDB:

  1. "~\"Чтение символов из C:\\src.exe...\"" - OK (out_of_band_record -> stream_record -> console_stream_output)
  2. "(gdb)" -> ОК (запись_терминатора)
  3. "^done,bkpt={number=\"1\",type=\"точка останова\",disp=\"keep\",enabled=\"y\",addr=\"0x00000000004014e4\",file=\ "src.s\",fullname=\"C:\\src.s\",line=\"17\",thread-groups=[\"i1\"],times=\"0\",оригинал -location=\"main\"}" - FAIL (за исключением: строка 1:0 не имеет подходящей альтернативы при вводе '^done,bkpt={number=')
  4. "^done,bkpt=\"1\"" - FAIL (строка 1:0 не имеет подходящей альтернативы при вводе '^done,bkpt=)
  5. "^done,bkpt={}" - FAIL (строка 1:0 не имеет подходящей альтернативы при вводе '^done,bkpt={}')

Почему мой парсер не распознал строки №3-5?

P.S.: Цель C# для предварительной версии ANTLR v.4.2.0 от Nuget


person Dem0n13    schedule 11.03.2014    source источник


Ответы (1)


Для начала, пусть ваш STRING_LITERAL также соответствует кавычкам: не сопоставляйте их в правиле синтаксического анализатора. И пусть ваше правило VARIABLE соответствует хотя бы одному символу (замените * на +).

person Bart Kiers    schedule 11.03.2014