【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
词法分析是编译原理的基础。目前来说,大部分编程语言还是以英文为主。使用英文有几个好处,这主要是因为英文的单词和单词之间是用空格分开来的,不像中文需要用词组来分割。记得读书的时候,有一个编译原理上机作业,就是编写一个词法分析器。如果是纯手工编写词法分析器,那么势必涉及到状态机的知识。然而如果使用javacc来编写,只需要描述清楚规则就可以了。
目前词法分析涉及到的分词主要有这么几种,一种是关键字,一种是标识符,剩下来的就是各种各样的符号、字符串、数字等等。通常来说,分词就是将一长串的字符串解析成一个一个token。
当然,除了分词之外,有一些字符也是要过滤的,比如换行、空格、注释等等。
代码链接:https://github.com/feixiaoxing/DIYCompiler
1、关键字
关键字比较好理解。就是某个编程语言当中被预留的一些单词。比如c语言里面if、else、for、while、switch、case、goto等等,这些都属于关键字。javacc中一般是这么安排的,
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
2、标识符
除了关键字之外,接下来就该说说标志符了。标识符通常就是各种各样变量的名字。这个名字一般用于描述全局变量、局部变量、函数名、函数参数、函数调用等等。对于标识符,javacc是这样来描述的,
TOKEN: {}
3、其他符号
在关键字和标识符之后,留下来的就是各种各样的计算符号、数字、字符串和一些特殊付好了。比如,数字一般这么描述,
TOKEN: { }
计算符号通常这么来描述,
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
特殊符号也有一些,比如这些,
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
4、待过滤的符号
在编程代码中,有一些符号是要过滤的,他们不参与最终的代码生成,
SKIP: { <[" ", "\t", "\r", "\n"]> }
这样,有了上面四种形式的符号,基本的词法分析就差不多了。这里没有描述出来所有的符号,本着用多少记录多少的想法,大家在实际开发中可以根据自己的需要灵活增减。
5、实例
之前我们谈到了四则运算,这里稍作改变,其实就可以将语法表达式全部用token来表示了,
options {STATIC = false;
}PARSER_BEGIN(Parse)
import java.io.*;
public class Parse {public static void main(String[] args) {for (String arg : args) {try {System.out.println(evaluate(arg));} catch (ParseException ex) {System.err.println(ex.getMessage());}}}public static long evaluate(String src) throws ParseException {Reader reader = new StringReader(src);return new Parse(reader).expr();}
}
PARSER_END(Parse)SKIP: { <[" ", "\t", "\r", "\n"]> }TOKEN: { }TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}TOKEN: {}TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}
TOKEN: {}long expr() throws NumberFormatException :
{long value = 0 ;
}
{value = main_expr() { return value ; }
}long main_expr() throws NumberFormatException :
{long a ;long b ;long value = 0 ;
}
{a = primary() {value = a;}( b = primary(){ value += b; }| b = primary(){ value -= b; })*{ return value ; }
}long primary() throws NumberFormatException :
{long a ;long b ;long value = 0 ;
}
{a = secondary() {value = a;}( b = secondary(){ value *= b; }| b = secondary(){ value /= b; })*{ return value ; }
}long secondary() throws NumberFormatException:
{Token a;long b = 0;long value = 0;
}
{(a = {value = Integer.parseInt( a.image );} | b =main_expr() { value = b;}){ return value;}
}
这里有一点需要注意下,如果在语法表达式中需要使用token的时候,应该用<>来表示。此外如果需要解析这个token的时候,可以直接转变为Token,获取对应的信息就可以了。
上一篇:二叉树刷题
下一篇:position有哪些属性和区别
相关内容
热门资讯
找不到安卓子系统,揭秘原因及解...
最近我在使用安卓手机的时候遇到了一个让人头疼的问题——找不到安卓子系统!这可真是让我抓耳挠腮,不知道...
安卓p系统如何使用,功能亮点与...
你升级到安卓P系统了吧?是不是有点小激动,想要立刻探索这个新系统的所有酷炫功能呢?别急,让我带你一步...
多多安卓系统app下载,一站式...
你有没有发现,最近手机上多了一个超级酷炫的系统——多多安卓系统!是不是已经跃跃欲试,想要下载体验一番...
r801 安卓系统,深度解析新...
你有没有听说过R801安卓系统?这可是最近在数码圈里炒得火热的一个话题呢!想象你的手机突然变得像一台...
安卓系统国外能用吗,探讨安卓系...
你有没有想过,当你拿着那部心仪的安卓手机,准备出国旅行或者工作的时候,会不会突然发现,哎呀妈呀,这安...
健康怀仁安卓系统下载,健康相伴
你有没有想过,在这个信息爆炸的时代,拥有一款健康、稳定的操作系统是多么重要的事情呢?今天,就让我带你...
手机系统模拟安卓5.0,系统革...
你有没有想过,如果手机系统可以像安卓5.0那样模拟出来,会是怎样的体验呢?想象你手中的设备瞬间变身成...
关闭安卓电池检测系统,解锁续航...
你有没有发现,手机用久了,电池续航能力好像越来越不给力了?是不是觉得安卓系统的电池检测系统太烦人了?...
安卓系统变ios永久,探索系统...
你知道吗?最近在科技圈里可是掀起了一股热潮呢!那就是安卓系统用户纷纷转向iOS系统的现象。这究竟是怎...
安卓系统虚拟按键失灵,原因排查...
手机里的安卓系统突然间出了点小状况,虚拟按键失灵了!这可真是让人头疼不已。想象你正沉浸在游戏的世界里...
安卓北京交警系统繁忙,揭秘安卓...
最近北京的小伙伴们有没有发现,打开手机上的安卓交警系统,那可真是忙得不亦乐乎啊!不信?那就跟着我一起...
苹果和安卓互用系统,共创未来
你有没有想过,为什么你的苹果手机上的应用,有时候也能在安卓手机上顺畅运行呢?这背后,其实有一个神奇的...
安卓系统强制内置相机,隐私与安...
你知道吗?最近在安卓系统上,有一个让人有点摸不着头脑的小变化引起了大家的关注。那就是安卓系统竟然开始...
安卓系统读书app推荐,安卓系...
你有没有发现,随着智能手机的普及,阅读变得越来越方便了呢?尤其是在安卓系统上,各种各样的读书app层...
安卓系统新出的机型,探索【型号...
最近手机圈可是热闹非凡呢!安卓系统新出的机型层出不穷,简直让人眼花缭乱。今天,就让我带你一起探索这些...
安卓与苹果系统游戏,游戏生态对...
你有没有发现,现在手机游戏越来越流行了?不管是走在路上,还是在公交车上,总能看到大家低头玩着手机,那...
闭源系统和安卓开源系统,揭秘闭...
你有没有想过,为什么你的手机里装了那么多应用,却总感觉少了点什么?没错,就是那股自由自在的“玩”劲儿...
小米安卓系统密码破解,揭秘安全...
小米安卓系统密码破解:一场技术与道德的较量在数字化时代,手机已经成为我们生活中不可或缺的一部分。小米...
ios系统游戏转安卓系统游戏,...
你有没有想过,为什么有些游戏在iOS系统上玩得那么顺畅,一到安卓系统上就卡得跟什么似的?今天,就让我...
安卓90系统怎么下载,体验流畅...
你有没有发现,安卓90系统最近可是火得一塌糊涂呢!不少小伙伴都在问,安卓90系统怎么下载?别急,今天...