编译器一日一练(DIY系列之词法分析)
admin
2024-01-18 03:18:44
0

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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,获取对应的信息就可以了。

相关内容

热门资讯

magiclu是不是安卓系统,... 亲爱的读者,你是否曾好奇过,那个在手机应用市场上备受瞩目的“magiclu”是否采用了安卓系统呢?今...
安卓系统是什么样的系统,全面解... 你有没有想过,你的手机里那个默默无闻的安卓系统,究竟是个啥样的家伙?它就像你的贴心小秘书,每天都在默...
安卓系统玩不了光遇,光遇安卓版... 最近是不是有很多小伙伴在朋友圈里抱怨,说安卓系统的手机竟然玩不了《光遇》这款游戏?别急,让我来给你详...
全民k歌安卓系统与苹果系统,安... 你知道吗?在音乐的世界里,全民K歌可是个超级热门的APP,它让无数人都能轻松成为“歌神”。不过,你知...
安卓系统用什么画图软件,基于安... 你有没有想过,在安卓手机上画画,那感觉简直就像是在纸上挥洒色彩一样自由呢?没错,现在就让我来给你揭秘...
安卓5.0转系统应用,全面解析... 你有没有想过,你的安卓手机系统升级后,那些曾经陪伴你度过无数时光的应用,是不是也该换换新装呢?今天,...
安卓系统emoji摊手表情,轻... 你有没有发现,每次在手机上打字聊天,表情符号简直就是沟通的魔法师!它们能瞬间让你的文字变得生动有趣,...
抖音如何选择安卓系统,打造个性... 你有没有想过,为什么你的手机里那么多应用,偏偏抖音那么受欢迎呢?没错,抖音这个短视频平台,简直就是年...
安卓系统用谷歌地图,全方位城市... 你有没有发现,现在手机上最火的地图应用非谷歌地图莫属了?尤其是安卓系统的用户,简直离不开它!今天,就...
手机病毒怎么清理安卓系统,全方... 手机里突然冒出了病毒,是不是感觉整个人都不好了?别慌,今天就来给你支几招,让你的安卓系统恢复清新,跟...
安卓系统二手推荐,轻松升级你的... 你有没有想过,拥有一台全新的手机?是不是觉得那高昂的价格让你望而却步?别担心,今天我要给你带来一个省...
任务系统小说app安卓,探索任... 你有没有发现,最近手机上多了一个特别有趣的东西?没错,就是那些任务系统小说app!它们就像是在你的手...
win10系统下安装安卓系统,... 亲爱的电脑迷们,你是否曾梦想过在你的Windows 10系统上同时运行安卓系统呢?想象一边享受着Wi...
安卓系统车载如何调音响,安卓车... 你有没有发现,随着科技的发展,车载音响系统已经不再是那个单调的“轰隆隆”了?现在,很多安卓系统的车载...
安卓系统的视频号在哪,轻松创建... 你有没有发现,最近安卓手机上突然多了一个神奇的小功能,那就是视频号!没错,就是那个在微信上红透半边天...
安卓子系统占用大量内存,揭秘内... 你有没有发现,你的安卓手机最近变得越来越“胖”了?没错,就是那个我们每天都离不开的安卓子系统,它竟然...
旧安卓手机安装linux系统,... 你那台旧安卓手机是不是已经有点儿力不从心了?别急着淘汰它,今天就来教你怎么给它来个华丽变身——安装L...
安卓系统工作模式有几种,揭秘多... 你有没有想过,你的安卓手机里竟然隐藏着这么多的秘密?没错,就是安卓系统的工作模式。你知道吗,安卓系统...
安卓系统话筒表情包,趣味横生的... 你有没有发现,最近你的手机里多了一个新玩意儿?没错,就是那个安卓系统话筒表情包!它可是现在社交圈里的...
安卓光遇适合的系统,畅游神秘世... 你有没有发现,最近安卓手机上出现了一款超级好玩的游戏——光遇!这款游戏不仅画面唯美,而且玩法独特,让...