稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数。这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式。而标识符的正则表达式有4万多个字符那么长而且没有可读性,所以加一个额外字符串描述一下。它将来会被用于生成编译错误信息。

最后我们来写空白符、换行符和注释的正则表达式。这三个是完全按照C# spec的规范编写的。其中注释包含了两种://开头直到换行的注释已经/*开头直到*/的多行注释。大家可以学习一下它们的正则表达式怎么写:

var RE_SpaceChar = RE.CharsOf(c => Char.GetUnicodeCategory(c) == UnicodeCategory.SpaceSeparator);

WHITESPACE = lex.DefineToken(RE_SpaceChar | RE.CharSet("\u0009\u000B\u000C"));

LINE_BREAKER = lex.DefineToken(
    RE.CharSet("\u000D\u000A\u0085\u2028\u2029") |
    RE.Literal("\r\n")
);

var RE_InputChar = RE.CharsOf(c => !"\u000D\u000A\u0085\u2028\u2029".Contains(c));
var RE_NotSlashOrAsterisk = RE.CharsOf(c => !"/*".Contains(c));
var RE_DelimitedCommentSection = RE.Symbol('/') | (RE.Symbol('*').Many() >> RE_NotSlashOrAsterisk);

COMMENT = lex.DefineToken(
    (RE.Literal("//") >> RE_InputChar.Many()) |
    (RE.Literal("/*") >> RE_DelimitedCommentSection.Many() >> RE.Symbol('*').Many1() >> RE.Symbol('/'))
);

最后还有一点后续的代码,从Lexicon对象生成ScannerInfo,再生成Scanner:

ScannerInfo info = lexicon.CreateScannerInfo();
Scanner scanner = new Scanner(info);

string source = "//任意miniSharp源代码";
StringReader sr = new StringReader(source);

scanner.SetSource(new SourceReader(sr));
scanner.SetSkipTokens(WHITESPACE.Index, LINE_BREAKER.Index, COMMENT.Index);

这样就完成了!我们创建了一个完整的miniSharp词法分析器。现在它就能分析所有miniSharp源代码了。注意我们设定了该词法分析器忽略所有空白符、换行以及注释,是为了后面语法分析简便而考虑的。各位读者可以自己试着任意扩展这个词法分析器,比如增加字符串常量的词法、更多关键字和运算符甚至前所未有的新词法。祝各位实践愉快!下一篇开始我们要进入另一个重要的环节——语法分析部分,敬请期待。

此外别忘了关注我的VBF项目:https://github.com/Ninputer/VBF 和我的微博:http://weibo.com/ninputer 多谢大家支持!

最新文章

  1. Visual Studio Code,完美的编辑器
  2. iOS开发 二维码生成
  3. SSh结合Easyui实现Datagrid的分页显示
  4. hdu 3635 Dragon Balls(并查集应用)
  5. Intel 80x86 寻址模式
  6. c#-委托,匿名方法,lambda表达的关系
  7. 再回首UML之下篇
  8. Scrapy爬虫框架第五讲(linux环境)【download middleware用法】
  9. 大数据与 AI 生态中的开源技术总结
  10. python初学之缓存清理:完全相同的代码与环境但是其中一个文件可以执行成功,一个执行不成功
  11. nodeJs express mongodb 建站(linux 版)
  12. springCloud com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
  13. ES6_入门(2)_const命令
  14. Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
  15. 7、LwIP协议规范翻译——网络接口
  16. 排序jq
  17. 阿里巴巴开源项目: canal
  18. js,jquery的数字型字符串变量比较大小
  19. 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship (meet in the middle)
  20. ELASTIC 5.2部署并收集nginx日志

热门文章

  1. C++編程札記「基礎」
  2. KMP学习
  3. UIStackView相关
  4. Ajax之 beforeSend和complete longind制作
  5. win7虚拟机起不来,报错transport vmdb error -44 message the vmware authorization
  6. Sublime Text3 配置markdown插件
  7. javascript获取对应页面的代码
  8. JQuery属性过滤(转)
  9. Android BaseAdapter ListView (SD卡中文件目录显示出来)
  10. [转] PostgreSQL的时间/日期函数使用