我对灵气比较陌生,正在尝试解析一种类似汇编程序的语言。
例如,我想解析:
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_('"') );