什么是lexer,什么是html.parser什么意思,lexer和html.parser什么意思之间的关系

  开源语法分析器--ANTLR
  1.1 词法分析器(Lexer)... 1-1
  1.2 语法分析器(Parser)... 1-1
  1.3 ANTLR. 1-2
  2.1 安装及使用... 2-2
  2.2 ANTLR语法文件解析... 2-3
  2.3 ANTLR规则(RULE)解析... 2-4
  4.1 ANTLR Studio插件的安装... 4-7
  4.2 功能简介
  1 ANTLR简介
  ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器()的框架。ANTLR可以通过断言(Predicate)解决;支持动作(Action)和返回值(Return Value)来;更棒的是,它可以根据输入自动生成语法树并可视化的显示出来(这一点我将在下面的例子中演示)。由此,计算机语言的翻译变成了一项普通的任务—在这之前YACC/LEX显得过于学院派,而以LL(k)为基础的ANTLR虽然在效率上还略有不足,但是经过近些年来的升级修改,使得ANTLR足以应付现存的绝大多数应用。感谢Terence 博士和他的同事们十几年来的出色工作,他们为编译理论的基础和语言工具的构造做了大量基础性工作,也直接导致了ANTLR的产生。
  1.1 词法分析器(Lexer)
  词法分析器又称为Scanner,Lexical analyser和Tokenizer。程序设计语言通常由关键字和严格定义的语法结构组成。编译的最终目的是将程序设计语言的高层指令翻译成物理机器或虚拟机可以执行的指令。词法分析器的工作是分析量化那些本来毫无意义的字符流,将他们翻译成离散的字符组(也就是一个一个的Token),包括关键字,标识符,符号(symbols)和操作符供语法分析器使用。
  1.2 语法分析器(Parser)
  编译器又称为Syntactical analyser。在分析字符流的时候,Lexer不关心所生成的单个Token的语法意义及其与上下文之间的关系,而这就是Parser的工作。语法分析器将收到的Tokens组织起来,并转换成为言语法定义所允许的序列。
  无论是Lexer还是Parser都是一种识别器,Lexer是字符序列识别器而Parser是Token序列识别器。他们在本质上是类似的东西,而只是在分工上有所不同而已。
  1.3 树分析器 (tree parser)
  树分析器可以用于对语法分析生成的进行遍历,并能执行一些相关的操作。
  1.4 ANTLR
  ANTLR将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的词法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:3次
参与编辑人数:3位
最近更新时间: 14:56:00
申请可获得以下专属权利:
贡献光荣榜3429人阅读
毕设工作(7)
众所周知,Htmlparser本身有一些小bug,而且也有三年没更新了。所以现在基于java的信息抽取多转向NekoHtml。不过Htmlparser本身还是有不少优点,主要是扩展性强,其利用的设计模式值得学习。由于时间的关系,现在项目还是使用Htmlparser,以后有时间会对nekohtml进行研究。&&& 今天遇到的bug来自于对&script&的解析。假如一个网页的部分代码如下,那么HtmlParser是必然会出错的:&script language="javascript"&
var strMsg = "&div aligh=left&&span class='font14 style4'&&font color=red&******你的投票已提交,谢谢! ******&/font&&/span&&/div&";
var existStrMsg = "&div aligh=left&&span class='font14 style4'&&font color=red&******你已经投过票了,谢谢! ******&/font&&/span&&/div&";
var dealingStrMsg = "&div aligh=left&&span class='font14 style4'&&font color=red&******正在处理你的投票,请稍后...... ******&/font&&/span&&/div&";&&&&& htmlparser在解析一个节点时,首先确定节点Tag的类型,然后再调用相应的scanner进一步处理。对于&script&标签,需要调用的就是 org.htmlparser.scanners.ScriptScanner。ScriptScanner的Scan()方法部分代码如下:public static boolean STRICT = true
if (tag instanceof ScriptTag)
language = ((ScriptTag)tag).getLanguage ();
if ((null != language) &&
(language.equalsIgnoreCase ("JScript.Encode") ||
language.equalsIgnoreCase ("VBScript.Encode")))
code = ScriptDecoder.Decode (lexer.getPage (), lexer.getCursor ());
((ScriptTag)tag).setScriptCode (code);
content = lexer.parseCDATA (!STRICT);
position = lexer.getPosition ();
问题就出在 lexer.parseCDATA() 这个方法上。它提取&scirpt&标签的内容作为文本返回给 content 。当其中的参数为false时,它的截至条件是遇到 &&/&。也就是说此时尽管遇到的"&/" 是双引号内的文本内容,它仍然会认为遇到了截止标签。对于上文的HTML代码,截止标签就是&/font&。出现这个错误后,之后的内容都将被当做普通html代码来解析,直到再遇到&/script&。
解决的办法很简单 ,只需将参数改为:content = lexer.parseCDATA (STRICT);
当参数为true时,该方法会自动考虑引号的问题。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22930次
排名:千里之外
评论:14条
(3)(1)(2)(3)(3)(1)下次自动登录
现在的位置:
& 综合 & 正文
HTMLParser之Lexer的功能实现
需要的HTMLParser包到这里下载
HTML有三种类型的Node的节点,RemarkNode(Html中的注释)、TagNode(标签节点)、TextNode(文本节点)
lexer包里面对HTML经ixngle4级封装,Stream, Source, Page and Lexer
The package is arranged in four levels, Stream, Source
Page and Lexer in the order of lowest to highest. A
Stream is raw bytes from the URLConnection or file. It has no intelligence. A
Source is raw characters, hence it knows about the encoding scheme used and can be reset if a different encoding is detected after partially reading in the text. A
Page provides characters from the source while maintaining the index of line numbers, and hence can be thought of as an array of strings corresponding to source file lines, but it doesn't actually store any text, relying on the buffering within
the Source instead. The Lexer contains the actual lexeme parsing code. It reads characters from the page, keeping track of where it is with a
Cursor and creates the array of nodes using various state machines。
State Machines
The Lexer has the following state machines:
in text - parseString()
in comment - parseRemark()
in tag - parseTag()
in JSP tag - parseJsp()
There is another state machine -- parseCDATA -- used by higher level code (script and style scanners), but this isn't actually used by the lexer. 更多内容请到
超简短引入包
import java.io.*;import java.net.*;import java.util.V
import org.htmlparser.*;import org.htmlparser.util.*;import org.htmlparser.http.*;import org.htmlparser.lexer.*;
具体全面包
import java.io.Simport java.net.HttpURLCimport java.net.URLC
import org.htmlparser.filters.TagNameFimport org.htmlparser.filters.NodeClassFimport org.htmlparser.http.ConnectionMimport org.htmlparser.http.ConnectionMimport org.htmlparser.http.HttpHimport org.htmlparser.lexer.Limport org.htmlparser.lexer.Pimport org.htmlparser.util.DefaultParserFimport org.htmlparser.util.IteratorIimport org.htmlparser.util.NodeIimport org.htmlparser.util.NodeLimport org.htmlparser.util.ParserEimport org.htmlparser.util.ParserFimport org.htmlparser.visitors.NodeV
import org.htmlparser.lexer.Pimport org.htmlparser.util.NodeLimport org.htmlparser.util.ParserEimport org.htmlparser.visitors.NodeV
Lexer类中最重要的一个类nextNode
public class LexerExtratText
protected Page mP
protected Cursor mC
protected static int mDebugLineTrigger = -<span style="color:#;
public Page getPage ()
return (mPage);
public void setPage (Page page)
if (null == page)
throw new IllegalArgumentException ("page cannot be null");
public Node nextNode(boolean quotesmart)throws ParserException
//这里一直有一个低级的错误,那就是没return值;
//记录起始位置
//记录读取的字符
//读取的节点
//判断是否为Debug模式
if(mDebugLineTrigger!=-<span style="color:#)
Page page = getPage ();
int lineno = page.row (mCursor);
if (mDebugLineTrigger & lineno)
mDebugLineTrigger = lineno + <span style="color:#;
//取得当前字符的位置
start=mCursor.getPosition();
//取得当前的字符
ch=mPage.getCharacter(mCursor);
switch(ch)
// 判断是否到页尾
case Page.EOF:
//判断是否为一个标签的开始符
//读取下一个字符
ch=mPage.getCharacter(mCursor);
//判断是否到尾,若是则返回一个String Node
if(Page.EOF==ch)
ret=makeString(start,mCursor.getPosition());
//如果是jsp,则回退一个字符,进入parseJsp 的状态机
else if(ch=='%')
mPage.ungetCharacter(mCursor);
ret=parseJsp(start);
//如果是xml,则进入parsePI 的状态机
else if(ch=='?')
mPage.ungetCharacter(mCursor);
ret=parsePI(start);
//如果是’/'或字母,则进入parseTag的状态机
else if(ch=='/'||ch=='%'||Character.isLetter(ch))
mPage.ungetCharacter(mCursor);
ret=parseTag(start);
//如果是"!"则进入注释标签
else if(ch=='!')
ch=mPage.getCharacter(mCursor);
if(Page.EOF==ch)
ret=makeString(start,mCursor.getPosition());
if(ch=='&')
ret=makeRemark(start,mCursor.getPosition());
//进入Remark/Tag状态机,需要回退一个字符
mPage.ungetCharacter(mCursor);
if(ch=='-')
ret=parseRemark(start,quotesmart);
mPage.ungetCharacter(mCursor);
ret=parseTag(start);
//进入parserString状态机
ret=parserString(start,quotesmart);
mPage.ungetCharacter(mCursor);
ret=parseString(start,quotesmart);
加入main运行
public static void main(String[] args)
ConnectionManager manager=null;
manager=Page.getConnectionManager();
lexer=new Lexer(manager.openConnection(".cn/sagittarius.html"));
while(null!=(node=lexer.nextNode(false)))
System.out.println(node.toString());
catch(ParserException e)
e.printStackTrace();
Tag (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]): HTML
Tag (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]): HEAD
Txt (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]): TITLE
End (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]): /TITLE
Txt (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]): meta http-equiv="Content-Type" content="text/ ch...Txt (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#[<span style="color:#,<span style="color:#],<span style="color:#0[<span style="color:#,<span style="color:#2]): META http-equiv="refresh" content ="<span style="color:#;url='http://a...Txt (<span style="color:#0[<span style="color:#,<span style="color:#2],<span style="color:#1[<span style="color:#,<span style="color:#]):
End (<span style="color:#1[<span style="color:#,<span style="color:#],<span style="color:#8[<span style="color:#,<span style="color:#]): /HEAD
Txt (<span style="color:#8[<span style="color:#,<span style="color:#],<span style="color:#9[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#9[<span style="color:#,<span style="color:#],<span style="color:#5[<span style="color:#,<span style="color:#]): body
Rem (<span style="color:#5[<span style="color:#,<span style="color:#],<span style="color:#9[<span style="color:#,<span style="color:#]):
SUDA_CODE_START
Txt (<span style="color:#9[<span style="color:#,<span style="color:#],<span style="color:#0[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#0[<span style="color:#,<span style="color:#],<span style="color:#8[<span style="color:#,<span style="color:#8]): div id=sudsclickstreamdiv style='position:absolute...End (<span style="color:#8[<span style="color:#,<span style="color:#8],<span style="color:#4[<span style="color:#,<span style="color:#4]): /div
Txt (<span style="color:#4[<span style="color:#,<span style="color:#4],<span style="color:#5[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#5[<span style="color:#,<span style="color:#],<span style="color:#6[<span style="color:#,<span style="color:#]): script type="text/javascript"
Txt (<span style="color:#6[<span style="color:#,<span style="color:#],<span style="color:#9[<span style="color:#,<span style="color:#]):
//Rem (<span style="color:#9[<span style="color:#,<span style="color:#],<span style="color:#01[<span style="color:#,<span style="color:#]):
var _S_JV_="webbug_meta_ref_mod_noiframe_async_:...Txt (<span style="color:#01[<span style="color:#,<span style="color:#],<span style="color:#02[<span style="color:#,<span style="color:#]):
End (<span style="color:#02[<span style="color:#,<span style="color:#],<span style="color:#11[<span style="color:#,<span style="color:#]): /script
Txt (<span style="color:#11[<span style="color:#,<span style="color:#],<span style="color:#12[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#12[<span style="color:#,<span style="color:#],<span style="color:#43[<span style="color:#,<span style="color:#]): script type="text/javascript"
Txt (<span style="color:#43[<span style="color:#,<span style="color:#],<span style="color:#46[<span style="color:#,<span style="color:#]):
//Rem (<span style="color:#46[<span style="color:#,<span style="color:#],<span style="color:#68[<span style="color:#,<span style="color:#]):
_S_pSt("");
//Txt (<span style="color:#68[<span style="color:#,<span style="color:#],<span style="color:#69[<span style="color:#,<span style="color:#]):
End (<span style="color:#69[<span style="color:#,<span style="color:#],<span style="color:#78[<span style="color:#,<span style="color:#]): /script
Txt (<span style="color:#78[<span style="color:#,<span style="color:#],<span style="color:#79[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#79[<span style="color:#,<span style="color:#],<span style="color:#01[<span style="color:#,<span style="color:#]):
SUDA_CODE_END
Txt (<span style="color:#01[<span style="color:#,<span style="color:#],<span style="color:#05[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#05[<span style="color:#,<span style="color:#],<span style="color:#29[<span style="color:#,<span style="color:#]):
Txt (<span style="color:#29[<span style="color:#,<span style="color:#],<span style="color:#31[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#31[<span style="color:#,<span style="color:#],<span style="color:#61[<span style="color:#,<span style="color:#]): script language="javascript"
Txt (<span style="color:#61[<span style="color:#,<span style="color:#],<span style="color:#27[<span style="color:#,<span style="color:#65]):
var wrUrl="///";var wrDoma...
Tag (<span style="color:#27[<span style="color:#,<span style="color:#65],<span style="color:#67[<span style="color:#,<span style="color:#05]): img src="'+V+'" width="<span style="color:#" height="<span style="color:#" /
Txt (<span style="color:#67[<span style="color:#,<span style="color:#05],<span style="color:#863[<span style="color:#,<span style="color:#01]): ')}function vjGetAcc(){var B=document.loc...Tag (<span style="color:#863[<span style="color:#,<span style="color:#01],<span style="color:#245[<span style="color:#,<span style="color:#]): A){var D=E+F;if(document.cookie.substring(E...
End (<span style="color:#245[<span style="color:#,<span style="color:#],<span style="color:#254[<span style="color:#,<span style="color:#]): /script
Txt (<span style="color:#254[<span style="color:#,<span style="color:#],<span style="color:#256[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#256[<span style="color:#,<span style="color:#],<span style="color:#275[<span style="color:#,<span style="color:#]):
End Wrating
Txt (<span style="color:#275[<span style="color:#,<span style="color:#],<span style="color:#277[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#277[<span style="color:#,<span style="color:#],<span style="color:#327[<span style="color:#,<span style="color:#]):
START Nielsen//NetRatings SiteCensus V5.2 Txt (<span style="color:#327[<span style="color:#,<span style="color:#],<span style="color:#328[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#328[<span style="color:#,<span style="color:#],<span style="color:#371[<span style="color:#,<span style="color:#]):
COPYRIGHT <span style="color:#06 Nielsen//NetRatings Txt (<span style="color:#371[<span style="color:#,<span style="color:#],<span style="color:#372[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#372[<span style="color:#,<span style="color:#],<span style="color:#403[<span style="color:#,<span style="color:#]): script type="text/javascript"
Txt (<span style="color:#403[<span style="color:#,<span style="color:#],<span style="color:#562[<span style="color:#,<span style="color:#]):
var _rsCI="cn-sina2006";
var _rsCG=...
End (<span style="color:#562[<span style="color:#,<span style="color:#],<span style="color:#571[<span style="color:#,<span style="color:#]): /script
Txt (<span style="color:#571[<span style="color:#,<span style="color:#],<span style="color:#572[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#572[<span style="color:#,<span style="color:#],<span style="color:#645[<span style="color:#,<span style="color:#]): script type="text/javascript" src="//secure-c...End (<span style="color:#645[<span style="color:#,<span style="color:#],<span style="color:#654[<span style="color:#,<span style="color:#]): /script
Txt (<span style="color:#654[<span style="color:#,<span style="color:#],<span style="color:#655[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#655[<span style="color:#,<span style="color:#],<span style="color:#665[<span style="color:#,<span style="color:#]): noscript
Txt (<span style="color:#665[<span style="color:#,<span style="color:#],<span style="color:#667[<span style="color:#,<span style="color:#]):
Tag (<span style="color:#667[<span style="color:#,<span style="color:#],<span style="color:#749[<span style="color:#,<span style="color:#]): img src="//secure-/cgi-bin...Txt (<span style="color:#749[<span style="color:#,<span style="color:#],<span style="color:#750[<span style="color:#,<span style="color:#]):
End (<span style="color:#750[<span style="color:#,<span style="color:#],<span style="color:#761[<span style="color:#,<span style="color:#]): /noscript
Txt (<span style="color:#761[<span style="color:#,<span style="color:#],<span style="color:#762[<span style="color:#,<span style="color:#]):
Rem (<span style="color:#762[<span style="color:#,<span style="color:#],<span style="color:#810[<span style="color:#,<span style="color:#]):
END Nielsen//NetRatings SiteCensus V5.2 Txt (<span style="color:#810[<span style="color:#,<span style="color:#],<span style="color:#811[<span style="color:#,<span style="color:#]):
End (<span style="color:#811[<span style="color:#,<span style="color:#],<span style="color:#818[<span style="color:#,<span style="color:#]): /body
End (<span style="color:#818[<span style="color:#,<span style="color:#],<span style="color:#825[<span style="color:#,<span style="color:#]): /html
用这个代码肯定还不行,下一篇给出它的全代码
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 jsonparser是什么 的文章

 

随机推荐