Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
Compiler construction YACC的输出是什么?_Compiler Construction_Yacc_Lex - Fatal编程技术网

Compiler construction YACC的输出是什么?

Compiler construction YACC的输出是什么?,compiler-construction,yacc,lex,Compiler Construction,Yacc,Lex,我有一个下面列出的lex程序,它识别(词法分析)特定的标记,并在从键盘输入时将它们输出到屏幕。我想使用yacc对下面的代码进行语法分析,但我不太明白这一部分……输出会是什么样子?下面的代码是否足够?我在网上读了很多关于yacc的文章……只需要有人给我一个简单的解释。先谢谢你 /* Regular Definitions */ RelationalOp_1 "<" RelationalOp_2 "<=" RelationalOp_3 "=<"

我有一个下面列出的lex程序,它识别(词法分析)特定的标记,并在从键盘输入时将它们输出到屏幕。我想使用yacc对下面的代码进行语法分析,但我不太明白这一部分……输出会是什么样子?下面的代码是否足够?我在网上读了很多关于yacc的文章……只需要有人给我一个简单的解释。先谢谢你

/* Regular Definitions */
RelationalOp_1         "<"
RelationalOp_2      "<="
RelationalOp_3      "=<"    
RelationalOp_4      "=="
RelationalOp_5      "!="
RelationalOp_6      ">"
RelationalOp_7      ">="
RelationalOp_8      "=>"

%%

{RelationalOp_1}        {printf("(RelationalOp_1, %s)\n", yytext);}
{RelationalOp_2}        {printf("(RelationalOp_2, %s)\n", yytext);}
{RelationalOp_3}        {printf("(RelationalOp_3, %s)\n", yytext);}
{RelationalOp_4}        {printf("(RelationalOp_4, %s)\n", yytext);}
{RelationalOp_5}        {printf("(RelationalOp_5, %s)\n", yytext);}
{RelationalOp_6}        {printf("(RelationalOp_6, %s)\n", yytext);}
{RelationalOp_7}        {printf("(RelationalOp_7, %s)\n", yytext);}
{RelationalOp_8}        {printf("(RelationalOp_8, %s)\n", yytext);}

.                            printf("Invalid input: %s\n",yytext);

%%

main()
{
  yylex();
}

yywrap()
{
}
/*常规定义*/
关系运算1“
%%
{RelationalOp_1}{printf(((RelationalOp_1,%s)\n),yytext);}
{RelationalOp_2}{printf(((RelationalOp_2,%s)\n),yytext);}
{RelationalOp_3}{printf(((RelationalOp_3,%s)\n),yytext);}
{RelationalOp_4}{printf(((RelationalOp_4,%s)\n),yytext);}
{RelationalOp_5}{printf(((RelationalOp_5,%s)\n),yytext);}
{RelationalOp_6}{printf(((RelationalOp_6,%s)\n),yytext);}
{RelationalOp_7}{printf(((RelationalOp_7,%s)\n),yytext);}
{RelationalOp_8}{printf(((RelationalOp_8,%s)\n),yytext);}
.                            printf(“无效输入:%s\n”,yytext);
%%
main()
{
yylex();
}
yywrap()
{
}

您的问题的简短答案是否定的,您所拥有的对于使用yacc生成的解析器来说是不完整的。在lex生成的扫描器中,您希望在内存中向解析器提供令牌,而不是简单地向控制台写入内容


为了理解上下文,本文提供了一些全面的示例,并展示了lex和yacc生成的程序是如何协同工作的。您还可以查看的在线手册,这是yacc的GNU版本。

这只是在解析文件时写入操作名称和令牌ID,您想做什么?在学习了flex和yacc/bison之后,我决定使用自己的解析器。当您开始这样做时,如果有真正的问题,请告诉我们。