【发布时间】:2013-08-23 09:54:15
【问题描述】:
我对灵气比较陌生,正在尝试解析一种类似汇编的语言。
比如我要解析:
Func Ident{
Mov name, "hello"
Push 5
Exit
}
到目前为止,一切都很好。我可以正确解析它。 但是,错误处理程序有时会出现奇怪的错误位置。以如下错误代码为例:
Func Ident{
Mov name "hello" ; <-- comma is missing here
Push 5
Exit
}
以下是此解析中涉及的规则:
gr_function = lexeme["Func" >> !(alnum | '_')] // Ensure whole words
> gr_identifier
> "{"
> *( gr_instruction
|gr_label
|gr_vardecl
|gr_paramdecl)
> "}";
gr_instruction = gr_instruction_names
> gr_operands;
gr_operands = -(gr_operand % ',');
解析器会注意到错误,但会抱怨在 mov 之后缺少“}”。 我觉得问题出在“Func”的定义中,但无法确定。 我希望解析器抱怨缺少“,” 如果它抱怨相应的错误是可以的,但它绝对应该指出一个缺少的逗号是罪魁祸首。
我尝试过以下变体:
gr_operands = -(gr_operand
>> *(','
> gr_operand)
);
和其他人一样,但有其他奇怪的错误。
有没有人知道如何说“好吧,你可能有一个没有操作数的指令,但是如果你找到一个,并且在下一个之前没有逗号,那么在逗号处失败”?
更新
感谢您到目前为止的回答。 gr_operand 定义如下:
gr_operand = ( gr_operand_intlit
|gr_operand_flplit
|gr_operand_strlit
|gr_operand_register
|gr_operand_identifier);
gr_operand_intlit = int_;
gr_operand_flplit = double_;
gr_operand_strlit = '"'
> strlitcont
> '"'
;
gr_operand_register = gr_register_names;
// TODO: Must also not accept the keywords from the statement grammar
gr_operand_identifier = !(gr_instruction_names | gr_register_names)
>> raw[
lexeme[(alpha | '_') >> *(alnum | '_')]
];
escchar.name("\\\"");
escchar = '\\' >> char_("\"");
strlitcont.name("String literal content");
strlitcont = *( escchar | ~char_('"') );
【问题讨论】:
-
它无法通过任何规则解析“名称”,因此需要在“Mov”和“}”之后的
*(...)fails。您能否给出gr_instruction的完整定义以及所需的所有规则? -
完成。这是 gr_instruction 所依赖的所有内容。
标签: c++ parsing boost boost-spirit boost-spirit-qi