iQuery是一个开源的自动化测试框架项目,有兴趣的朋友能够在这里下载:
https://github.com/vowei/iQuery/downloadscss
源码位置:
https://github.com/vowei/iQueryhtml
在上一篇文章中,简单介绍了扩展iQuery,使其支持尽量多的自动化测试平台,但剩下对编程语言的扩展没有讲。python
当前iQuery已经实现了Java和JavaScript版本,对其余语言的支持仍在讨论当中,感兴趣的网友能够参照本文的讲解自行扩展。git
Antlr是能够生成不少编程语言的源文件,在其官网上,能够看到其支持:C、Java、JavaScript、C#、Object-C、Python、Perl等编程语言,详细状况请参阅:http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets。github
咱们知道,通常来讲编译器或者解释器的流程都是:
词法解析 -> 语法解析 -> 语义分析 -> 代码优化 -> 生成(执行)代码正则表达式
因为iQuery很简单,充其量就是一个DSL,因此在实现时,就直接将语义分析、代码优化跳过了,后面在讲解iQA这个编程语言的时候会聊到那些内容。编程
首先看一下iQuery的完整语法(其实能够把它看成一个广义的正则表达式对待):
https://github.com/vowei/iQuery/blob/master/iQuery.g 框架
由于语法很是简单,就没有必要将词法和语法分到两个文件去写了,直接合并在一个文件里,但合并并不意味着词法分析和语法分析这两个过程就合并成一个步骤了,antlr在生成代码是,仍是会生成两个类,iQueryLexer和iQueryParser两个类,也就是说仍是两个步骤。编程语言
先看词法分析过程,词法分析过程实际上就是将输入的字符串归类,归类过程当中能够剔除一些不用的字符(好比空格、注释之类的),方便在语法分析过程当中处理。词法分析和语法分析这两个过程,跟打牌相似,好比八十分,抓牌把牌分类的时候就是词法分析,打牌时就是语法和语义分析,抓牌后打牌前有个垫底过程,至关于在词法分析时扔掉一些不用的字符:函数
DESCENDANT: '>>'; EQ: 'eq'; GT: 'gt'; LT: 'lt'; NOT: 'not'; CONTAINS: 'contains'; EMPTY: 'empty'; HAS: 'has'; PREV: 'prev'; NEXT: 'next'; SIBLINGS: 'siblings'; NTH_CHILD: 'nth-child'; PARENT: 'parent'; LAST_CHILD: 'last-child'; FIRST_CHILD: 'first-child'; FIRST: 'first'; LAST: 'last'; INTEGER: DIGIT+; PERCENTAGE: ('+' | '-')? DIGIT+ ('.' DIGIT+)? '%'; FLOAT: ('+' | '-')? DIGIT+ ('.' DIGIT+)?; fragment DIGIT: ('0' .. '9'); ELEMENT: ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.')*; ASTERISK: '*'; QUOTED_STRING: '\'' .+ '\''; NEWLINE: '\r'? '\n'; WS: (' ' | '\t') { skip(); };
全部大写字母组成的单词都是词法分析后生成的记号(Token),匹配的方式是依照简化的正则表达式方式匹配,并且匹配的优先级依照记号在文件里的出现顺序。好比说:
今天先聊到这里,关于语法分析的内容,下一篇再讲。