我需要antlr4来解析一些简单的HTML文件。我已经将语法分为解析器语法和lexer语法,这样我就可以对标记内部的东西(
解析器语法:
grammar Rule;
options {
tokenVocab = HTMLLexer;
language = Java;
}
/* Parser Rules */
doc : type? html ;
type : '<!DOCTYPE HTML>' ;
html : shtml head body ehtml ;
head : shead meta* ehead ;
meta : smeta ;
body : sbody ebody ;
shtml : '<' 'html' attr* '>' ;
ehtml : '<' '/html' '>' ;
shead : '<' 'head' attr* '>' ;
ehead : '<' '/head' '>' ;
smeta : '<' 'meta' attr+ '>' ;
sbody : '<' 'body' attr* '>' ;
ebody : '<' '/body' '>' ;
attr : NAME '=' VALUE ;
lexer grammar HTMLLexer;
COMMENT : '<!--' .*? '-->' -> skip ;
CDATA : '<![CDATA[' .*? ']]>' ;
OPEN : '<' -> pushMode(INSIDE) ;
SPEC_OPEN : '<!' -> pushMode(INSIDE) ;
TEXT : (ENTITY | ~[<&])+ ;
fragment ENTITY
: '&' [a-zA-Z]+ ';'
| '&#' [0-9]+ ';'
| '&#x' [0-9A-Za-z]+ ';' ;
mode INSIDE;
CLOSE : '>' -> popMode ;
SLASH_CLOSE : '/>' -> popMode ;
StHTML : 'html' ;
EnHTML : '/html' ;
StHead : 'head' ;
EnHead : '/head' ;
StMeta : 'meta' ;
StBody : 'body' ;
EnBody : '/body' ;
NAME : 'class'
| 'content'
| 'http-equiv'
| 'id'
| 'lang'
| 'name'
| 'style'
| 'type'
;
EQUALS : '=' ;
VALUE : ('"' ~["<>\r\n]+ '"')
| ('\'' ~['<>\r\n]+ '\'')
| ~["'<>= \t\r\n]+ ;
;
WS : [ \t\r\n]+ -> skip ;
示例HTML文件:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=Generator content="Microsoft Word 14 (filtered)">
</head>
<body lang=EN-US style='text-justify-trim:punctuation'>
</body>
</html>
ANTLR4的输出:
line 1:6 token recognition error at: '\n'
line 2:6 token recognition error at: '\n'
line 3:5 token recognition error at: ' '
line 3:6 token recognition error at: 'htt'
line 3:9 token recognition error at: 'p'
...
[@0,0:0='<',<7>,1:0]
[@1,1:4='html',<10>,1:1]
[@2,5:5='>',<1>,1:5]
[@3,7:7='<',<7>,2:0]
[@4,8:11='head',<6>,2:1]
[@5,12:12='>',<1>,2:5]
[@6,14:14='<',<7>,3:0]
[@7,15:18='meta',<2>,3:1]
[@8,30:30='=',<9>,3:16]
[@9,51:51='=',<9>,3:37]
[@10,57:61='/html',<4>,3:43]
[@11,71:71='=',<9>,3:57]
[@12,85:85='>',<1>,3:71]
[@13,87:87='<',<7>,4:0]
[@14,88:91='meta',<2>,4:1]
[@15,115:115='=',<9>,4:28]
[@16,146:146='>',<1>,4:59]
[@17,148:148='<',<7>,5:0]
[@18,149:153='/head',<8>,5:1]
[@19,154:154='>',<1>,5:6]
[@20,157:157='<',<7>,7:0]
[@21,158:161='body',<5>,7:1]
[@22,167:167='=',<9>,7:10]
[@23,179:179='=',<9>,7:22]
[@24,211:211='>',<1>,7:54]
[@25,213:213='<',<7>,8:0]
[@26,214:218='/body',<11>,8:1]
[@27,219:219='>',<1>,8:6]
[@28,221:221='<',<7>,9:0]
[@29,222:226='/html',<4>,9:1]
[@30,227:227='>',<1>,9:6]
[@31,229:228='<EOF>',<-1>,10:0]
line 3:16 mismatched input '=' expecting NAME
line 4:28 mismatched input '=' expecting NAME
line 7:10 mismatched input '=' expecting {'>', NAME}
首先,您需要将解析器的声明更改为解析器语法规则;
而不是语法规则;
。我不认为您的lexer有任何问题会产生这些特定的错误消息,所以这可能是问题所在。
我正在尝试创建一个语法来解析Solr查询(只需要稍微相关,您不需要了解任何关于Solr的信息来回答这个问题--只需要比我了解更多关于ANTLR4.7的信息就可以了)。我将它建立在Solr6中的QueryParser.jj文件的基础上。我找了一个现存的,但似乎没有一个不是旧的和过时的。 我被困住了,因为当我尝试运行解析器时,我得到了“token recognition error”。 我创建的lex
我试图使用ANTLR4创建一个简单的解析器,但我在识别lexer令牌方面遇到了问题。问题是,即使单词SAYS后面有一个“:”,解析器规则也不能识别它。而且对于提及,@Michael也没有被识别出来。 输入的文本是:john说:hello@Michael这将不起作用 //LEXER规则
我正在编写一个ANTLR Lexer和解析器语法,它将解析与Java类非常相似的文本。最终,它将解析如下所示的文本: 我正在慢慢地构建Lexer和Parser。我已经成功地解析了,但是在解析时遇到了困难。 在添加对的支持之前,我能够在解析器中为空格、冒号和分号使用字符串文字,但在我遇到错误创建隐式标记。我为这些字符中的每一个定义了一个词法分析器规则,并用该规则替换了所有出现的文字。但是,这破坏了s
我正在使用GitHub提供的antlr4语法分析器和词法分析器来解析Python3中的PHP。 当我直接使用这些语法时,我的PoC代码工作: antlr试验。py 这给出了输出 当我使用以下PHP时。g4语法,我犯了很多错误: 在对pythons导入交换评论之后,我得到了这个错误 然而,当我在语法上运行antlr4工具时,我没有出错。我在这里被难住了——是什么导致了这个问题?
是否有方法为模式中捕获的所有字符返回一个字符串类型的标记,包括导致进入模式的字符? 模式何时结束? 我知道我也可以像这样编写字符串标记:
我正在使用Antrl4解析一种类似java的语言,在这种语言中,可以使用专有的查询语言在括号中编写表达式。假设在Java方法中,应该允许以下行: 但这会导致第一个括号字符上的令牌识别错误。 这种做法有什么问题吗?有人能指出我正在犯的错误吗?