Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 在yacc工具中生成自定义错误消息_Syntax_Message_Bison_Yacc - Fatal编程技术网

Syntax 在yacc工具中生成自定义错误消息

Syntax 在yacc工具中生成自定义错误消息,syntax,message,bison,yacc,Syntax,Message,Bison,Yacc,嗨,我刚开始研究lex和yacc工具 我意识到yyerror只从yacc接收字符串“syntax error”。 我想知道是否可以自定义此字符串 哦,我还能区分不同类型的错误吗?(轮胎将丢失标记和附加标记视为不同的错误。) 如果是的话,我该如何 非常感谢。您可以在yyerror中自由打印任何您想要的消息(甚至根本没有消息),因此您可以根据需要定制消息。常见的定制是添加触发错误的令牌的行号(可能还有列号)。如果愿意,您当然可以更改文本,但是如果您只是想将其更改为其他语言,您可能应该使用该机制。您将

嗨,我刚开始研究lex和yacc工具

我意识到yyerror只从yacc接收字符串“syntax error”。 我想知道是否可以自定义此字符串

哦,我还能区分不同类型的错误吗?(轮胎将丢失标记和附加标记视为不同的错误。) 如果是的话,我该如何


非常感谢。

您可以在
yyerror
中自由打印任何您想要的消息(甚至根本没有消息),因此您可以根据需要定制消息。常见的定制是添加触发错误的令牌的行号(可能还有列号)。如果愿意,您当然可以更改文本,但是如果您只是想将其更改为其他语言,您可能应该使用该机制。您将在源发行版的
运行时po
子目录中找到
.po
文件。如果启用此功能,bison将在字符串传递到
yyerror
之前安排对其进行翻译,但是如果您更方便的话,您当然可以自己在
yyerror
中进行翻译

我怀疑您真正想要的是bison生成一条信息更丰富的错误消息。Bison只有一种可选的错误消息格式,其中包括一个“预期”令牌列表。您可以要求Bison生成这样的错误消息,包括

%define parse.error verbose
%define parse.lac full
在你的开场白中。例如,bison解析算法有时会产生不正确的预期标记列表(因为它不是为这个特殊目的而设计的);通过启用,还可以包括

%define parse.error verbose
%define parse.lac full
这确实会对性能造成轻微的影响。有关详细信息,请参阅链接的手册部分

此功能生成的令牌列表使用bison文件中提供的令牌名称。这些名称通常对用户不太友好,因此您可能会发现自己生成了错误消息,例如臭名昭著的PHP错误

syntax error, unexpected T_CONSTANT_ENCAPSED_STRING
(注意:最近的PHP版本产生了一个不同但同样神秘的消息。)

为了避免这种情况,请为令牌定义双引号别名。这还可以使您的语法更具可读性:

%type <string> TOK_ID "identifier"
%token TOK_IF "if" TOK_ELSE "else" TOK_WHILE "while"
%token TOK_LSH "<<"
/* Etc. */

%%

stmt: expr ';' 
    | while 
    | if
    | /* ... */
while: "while" '(' expr ')' stmt
expr: "identifier"
    | expr "<<" expr
/* ... */
%type TOK_ID“标识符”
%令牌TOK_IF“IF”TOK_ELSE“ELSE”TOK_WHILE“WHILE”

%token TOK_LSH“感谢您的回复,我一直在寻找类似这样的错误:语法错误:Additional token“token”错误:missing token“token”“这是两个不同的错误,如您所说,使用verbose会使yacc为两个不同的错误返回相同的字符串。有什么方法可以区分它们吗?@yunho:唯一的方法是尝试插入令牌X,然后独立地删除令牌Y,然后重试解析,看看是否有效。可能两者都不起作用;这两种方法都可能奏效,但这两种方法都不是程序员的意图。无论如何,你可以自己做,但野牛不会为你做;bison解析器从左到右读取,不会回溯。@yunho:也许你可以在你的错误问题中添加一些例子,这些错误“显然”是一种或另一种类型。谢谢,但回溯并不是我想要的。这些例子是1。错误:语法错误:附加令牌“token”2。错误:缺少令牌“token”第一个令牌有额外的令牌,因此,错误。第二个没有令牌,因此也是一个不同类型的错误。我真的不知道回溯如何帮助区分这两种类型的错误。哦,等等,我没有看到编辑过的注释。我会再试一次,非常感谢!