LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 —— 题记
版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy
简单的词法和语法分析
Lex和Yacc真是太好用了,非常方便我们构建一门语言的分析程序。
如果你对Lex和Yacc不了解的话,建议先看下我之前写的两篇文章,分别介绍了Lex和Yacc的用法。
Lex识别C风格字符串和注释
http://blog.csdn.net/xfxyy_sxfancy/article/details/45024573
创造新语言(2)——用Lex&Yacc构建简单的分析程序
http://blog.csdn.net/xfxyy_sxfancy/article/details/45046465
FLex创建一门语言的词法分析程序
我们创建的是一门编程语言,那么词法分析程序就不能像做实验一样那么草率,必须考虑周全,一般一门语言的词法分析程序大概需要囊括如下的几个方面:
识别关键字、识别标识符、识别基本常量(数字、浮点数、字符串、字符)、识别注释、识别运算符
这些都是非常重要的,而且是一门语言语法中必不可少的部分。
于是RedApple的词法分析部分,我就设计成了这样:
%{
#include <string>
#include "Model/nodes.h"
#include <list>
using namespace std;
#include "redapple_parser.hpp"
#include "StringEscape.h"
#define SAVE_TOKEN yylval.str = maketoken(yytext, yyleng)
#define SAVE_STRING yylval.str = makestring(yytext, yyleng, 2)
#define SAVE_STRING_NC yylval.str = makestring(yytext, yyleng, 3)
extern "C" int yywrap() { return 1; }
char* maketoken(const char* data, int len);
char* makestring(const char* data, int len, int s);
%}
%option yylineno
%%
"/*"([^\*]|(\*)*[^\*/])*(\*)*"*/" ; /* 就是这种注释 */
#[^\n]*\n ; /* 井号注释 */
"//"[^\n]*\n ; /* 双线注释 */
[ \t\v\n\f] ; /* 过滤空白字符 */
"==" return CEQ;
"<=" return CLE;
">=" return CGE;
"!=" return CNE;
"<" return '<';
"=" return '=';
">" return '>';
"(" return '(';
")" return ')';
"[" return '[';
"]" return ']';
"{" return '{';
"}" return '}';
"." return '.';
"," return ',';
":" return ':';
";" return ';';
"+" return '+';
"-" return '-';
"*" return '*';
"/" return '/';
"%" return '%';
"^" return '^';
"&" return '&';
"|" return '|';
"~" return '~';
/* 宏运算符 */
"@" return '@';
",@" return MBK;
/* 下面声明要用到的关键字 */
/* 控制流 */
"if" return IF;
"else" return ELSE;
"while" return WHILE;
"do" return DO;
"goto" return GOTO;
"for" return FOR;
"foreach" return FOREACH;
/* 退出控制 */
"break"|"continue"|"exit" SAVE_TOKEN; return KWS_EXIT;
"return" return RETURN;
/* 特殊运算符 *