ANTLR:输入时没有可行的选择

时间:2014-03-11 22:06:31

标签: c# parsing antlr antlr4 lexer

抱歉我的英语不好。

我为来自this manual的GDB / MI输出命令编写了ANTLR4语法:

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中读取符号... \“” - 确定(out_of_band_record - > stream_record - > console_stream_output)
  2. “(gdb)” - >好的(terminator_record)
  3. “^ DONE,BKPT = {数= \” 1 \”,类型= \ “断点\”,DISP = \ “保持\”,使能= \ “Y \”,ADDR = \ “0x00000000004014e4 \”,文件= \ “src.s \”,全名= \ “C:\\ src.s \”,行= \ “17 \”,线程组= [\ “I1 \”],倍= \“0 \ “,original-location = \”main \“}” - 失败(有例外:第1行:0在输入时没有可行的选择'^ done,bkpt = {number =')
  4. “^ done,bkpt = \”1 \“” - FAIL(第1行:0在输入'^ done,bkpt =时没有可行的替代方案)
  5. “^ done,bkpt = {}” - FAIL(第1行:0在输入'^ done,bkpt = {}'时没有可行的选择)
  6. 为什么我的解析器无法识别字符串#3-5?

    P.S。:来自Nuget的ANTLR v.4.2.0预发布的C#目标

1 个答案:

答案 0 :(得分:1)

对于初学者,让你的STRING_LITERAL也匹配引号:在解析器规则中不匹配它们。并让您的VARIABLE规则至少匹配一个字符(将*更改为+)。