0
我想解析jsp文件來識別指令標籤,jsp動作元素,scriptlet表達式等。爲此,我試圖擴展現有的html grammar。 我在正常的html標籤打開和jsp標籤打開方面存在問題。現有的語法有以下詞法規則:Antlr4解析jsp scriptlets表達式指令
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'
我一直在修改我的語法解析腳本標籤的更多細節。但是我在解析時遇到問題。 @Bart Kiers可以請你看看這個。 –