我有一个手写扫描仪和一个可以解析这个句子的野牛解析器(使它成为问题上下文的缩写):
var x : integer
野牛:
%require "3.2"
%define api.pure full
%code{
#include <stdio.h>
#include <string.h>
#include "Scanner.h"
#include<iostream>
}
%code{
int yylex(YYSTYPE *lvalp);
#include<iostream>
#include<string>
Scanner scanner;
void yyerror(const char *error);
}
%union {
int n;
double d;
char s[1000];
}
%token VAR COL ITYPE
%token IDENTIFIER
%token INTEGER
%token EOL
%type <s> type PrimitiveType IDENTIFIER
%type <s> INTEGER
%%
program:
| program EOL
| program SimpleDeclaration { }
;
SimpleDeclaration: VariableDeclaration
;
VariableDeclaration: VAR IDENTIFIER COL type {std::cout<<"defined variable " << $2 << " with type " << $4 << std::endl; }
type: IDENTIFIER
| PrimitiveType
;
PrimitiveType: ITYPE { strcpy($$, "int"); }
;
%%
int main()
{
scanner.set_file("inp.txt");
return yyparse();
}
void yyerror(const char *error)
{
std::cout << "syntax error" << std::endl;
}
int yylex(YYSTYPE *lvalp)
{
return scanner.get_next_token(lvalp);
}
scanner.get_next_token(lvalp)
例如返回一个令牌INTEGER
(包括 parser.tab.hppscanner.cpp
并使用从令牌生成的枚举)。此外,在此之前,它会将正确的值放入lvalp
诸如strcpy(lvalp->s, nextTokenString.c_str())
等lvalp->n = toInt(nextTokenString)
......输出为:
defined variable x with type int
但我想使用 STL 容器和智能指针。在这个关于纯调用的页面中,如果您的令牌类型不同,则没有说明如何在没有lvalp*
联合的情况下使用。此外,根据这个页面,我应该使用接受语义类型而不是. 好吧,这会导致以下错误:%language "c++"
%define api.value.type variant
union
parser.ypp:3.1-21: error: %define variable 'api.pure' is not used
所以我想在将正确的标记返回给解析器而不使用联合的同时分配值,以便我可以使用所有 C++ 功能。
注意:我看到了这个例子,但我还是不明白函数是make_Number
已经存在还是已经生成了?如何从我的 next_token() 为属于已定义 %token 的 $ 变量添加值?
提前致谢。