jspファイルを解析して、ディレクティブタグ、JSPアクションエレメント、スクリプトレットの式などを識別したいとします。そのために、既存のhtmlを拡張しようとしていますgrammar。 通常のhtmlタグのオープンとjspタグのオープンを区別する際に問題に直面しています。既存の文法は以下の字句解析ルールがあります。Antlr4 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
;
そして、そのためのcorrespodingパーサールール:
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さん、これを見てください。 –