要点
用lex&yacc命令缺省生成的是C文件,但事实上,仅是文件扩展名表示为C文件。可以用g++或者直接改名为C++就可以在lex&yacc中用C++功能。
代码
%{
#include <string>
#include <iostream>
%}
%%
[\t ]+ /* white space */
[a-zA-Z]+ {
std::string word(yytext);
std::cout<<"word: "<<word<<std::endl;
}
[0-9]+ {
std::string number(yytext);
std::cout<<"number: "<<number<<std::endl;
}
.|\n {ECHO; /* normal default anyway */ }
%%
int main()
{
std::cout<<"Lex and C++"<<std::endl;
yylex();
return 0;
}
运行
$ lex test.l
$ gcc -o test lex.yy.c -ll
test.l:3:10: fatal error: 'string' file not found
#include <string>
^
1 error generated.
$ g++ -o test lex.yy.c -ll
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
$ ls
lex.yy.c test test.l
$ ./test
Lex and C++
the price is 100 yuan.
word: the
word: price
word: is
number: 100
word: yuan
.
^C
$ cp lex.yy.c lex.yy.cpp
$ g++ -o test lex.yy.cpp -ll
$ ./test
Lex and C++
the price is 100 yuan.
word: the
word: price
word: is
number: 100
word: yuan
.
^C
$