C++ 如何正确执行lex和yacc之间的集成?

C++ 如何正确执行lex和yacc之间的集成?,c++,compiler-construction,bison,yacc,lex,C++,Compiler Construction,Bison,Yacc,Lex,我一直在尝试使用lex和yacc制作一个简单的词汇和语法扫描器,目前遇到的问题是:我无法将任何输入输出到控制台 以下是代码的相关部分: 法律: Yacc/语法: %{ 心房结构{ 载体c; }; #心房肌 %} %令牌ID OBJ LET %% Cmd:DeclVar';'{cout在这两个生产操作中,$$1都不是指任何已被赋予语义值的内容。如果扫描器操作分配yylval,终端将被赋予语义值。非终端值是通过在非终端的操作中分配给$来设置的。DeclVar中的所有内容不都应该是termi吗nal值

我一直在尝试使用lex和yacc制作一个简单的词汇和语法扫描器,目前遇到的问题是:我无法将任何输入输出到控制台

以下是代码的相关部分:

法律:

Yacc/语法:

%{
心房结构{
载体c;
};
#心房肌
%}
%令牌ID OBJ LET
%%

Cmd:DeclVar';'{cout在这两个生产操作中,
$$1
都不是指任何已被赋予语义值的内容。如果扫描器操作分配
yylval
,终端将被赋予语义值。非终端值是通过在非终端的操作中分配给
$
来设置的。DeclVar中的所有内容不都应该是termi吗nal值,因为它们不创建新规则?我仍在试图理解$$代表什么,因为我知道它们是语法右侧的左侧?是的,
DeclVar
的右侧包含四个终端。
$1
是对应于第一个终端的语义值,即
LET
。这没什么意义在
中,让
具有语义值,因为它是纯语法的;在该产品中,唯一可能合理地具有语义值的终端是
ID
,其语义值为
$2
。但是,您的扫描仪从不给该标记语义值(或任何其他标记)因此,您在
$2
中也找不到任何内容。您试过阅读吗?手册中包含了许多详细的说明。在这些生产操作中,也有一整章都没有说明
$1
是否引用任何给定语义值的内容。如果扫描器动作n赋值
yylval
。非终结值是通过在非终结符的操作中赋值给
$
来设置的。DeclVar中的所有内容不应该都是终结值吗,因为它们不会创建新规则?我仍在试着理解$$代表什么,因为我知道它们是语法的左侧,右侧?是的,右侧of
DeclVar
包含四个终端。
$1
是对应于第一个终端的语义值,即
LET
LET
具有语义值没有多大意义,因为它是纯语法的;
ID
是该产品中唯一可能具有语义值的终端,其语义值应为
$2
。但是,您的扫描仪从未给出该标记的语义值。(或任何其他标记)。因此,您也不会在
$2
中找到任何内容。您是否尝试阅读过该手册?手册中有许多详细说明。另外还有一整章介绍了
ID      {L}({L}|{D})*

%%


"let"      { return ( LET ); }
"{}"       { return ( OBJ ); }
{ID}       { return ( ID ); }
.          { return ( *yytext ); }