【发布时间】:2017-06-06 06:40:30
【问题描述】:
我想解析 jsp 文件以识别指令标记、jsp 操作元素、scriptlet 表达式等。为此,我正在尝试扩展现有的 html grammar。 我在区分正常的 html 标签打开和 jsp 标签打开时遇到了问题。现有语法有以下词法规则:
TAG_OPEN
: '<' -> pushMode(TAG)
;
//
// tag declarations
//
mode TAG;
TAG_CLOSE
: '>' -> popMode
;
TAG_SLASH_CLOSE
: '/>' -> popMode
;
TAG_SLASH
: '/'
;
//
// lexing mode for attribute values
//
TAG_EQUALS
: '=' -> pushMode(ATTVALUE)
;
TAG_NAME
: TAG_NameStartChar TAG_NameChar*
| TAG_NameStartChar* ':' TAG_NameStartChar*
;
TAG_WHITESPACE
: [ \t\r\n] -> skip
;
以及相应的解析器规则:
htmlElement
: TAG_OPEN htmlTagName htmlAttribute* TAG_CLOSE htmlContent TAG_OPEN TAG_SLASH htmlTagName TAG_CLOSE
| TAG_OPEN htmlTagName htmlAttribute* TAG_SLASH_CLOSE
| TAG_OPEN htmlTagName htmlAttribute* TAG_CLOSE
| TAG_OPEN TAG_SLASH htmlTagName TAG_CLOSE
// | jspDirective
// | jspDeclaration
| scriptlet
| script
| style
;
我正在尝试使用以下内容扩展上述规则:
scriptlet
: JSP_TAG_OPEN jspElement jspElementName jspElementAttribute* JSP_TAG_CLOSE
//|SCRIPTLET
;
jspElementName
: TAG_NAME
;
jspElementAttribute
: jspAttributeName TAG_EQUALS jspAttributeValue
;
jspAttributeName
: TAG_NAME
;
jspAttributeValue
: ATTVALUE_VALUE
;
jspElement
: jspDirective
| jspExpression
| jspDeclaration
| jspFragment
;
jspDirective
: JSP_DIRECTIVE_SIGN
;
jspExpression
: JSP_EXPRESSION_SIGN
;
jspDeclaration
: JSP_DECLARATION_SIGN
;
jspFragment
: JSP_FRAGMENT_SIGN
;
词法分析器规则是:
JSP_TAG_OPEN
: '<%' ' '*
;
JSP_DIRECTIVE_SIGN
: '@'
;
JSP_EXPRESSION_SIGN
: '='
;
JSP_DECLARATION_SIGN
: '!'
;
JSP_FRAGMENT_SIGN
: [ ]+
;
JSP_TAG_CLOSE
: '%>'
;
但我猜的问题是,每当遇到< 字符时,TAG_OPEN 的词法分析器规则就会开始运行,而不是等待查看这是否是一个 jsp 标记 <%。
所以当我试图解析一个包含以下内容的小 html 时:
<html>
<title>Statement Load page</title>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
prefix="html"%>
我收到此错误:
line 3:2 no viable alternative at input '@ taglib uri="http://jakarta.apache.org/struts/tags-html"\r\n\tprefix="html"%>\r\n'
【问题讨论】: