首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackOverflowError in ANTLR4

StackOverflowError in ANTLR4
EN

Stack Overflow用户
提问于 2015-07-02 19:54:50
回答 1查看 1.1K关注 0票数 5

我对ANTLR很陌生,并且尝试解析一个ASP文件。我在走树的时候遇到了错误。

org.antlr.v4.runtime.atn.LexerATNSimulator.getEpsilonTarget(LexerATNSimulator.java:495) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:476) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:478) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:478) at org.antlr.v4.runtime.atn中线程"main“java.lang.StackOverflowError中的异常.LexerATNSimulator.closure(LexerATNSimulator.java:478) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:458) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:478) at org.antlr.v4.runtime.atn.LexerATNSimulator.closure(LexerATNSimulator.java:478)

请提出什么是可能的根本原因。

代码语言:javascript
复制
**Lexer Grammar**

lexer grammar  ASPLexer;


HTML_COMMENT    
    : '<!--' .*? '-->'
    ;

HTML_CONDITIONAL_COMMENT    
    : '<![' .*? ']>'
    ;

XML_DECLARATION
    : '<?xml' .*? '>'
    ;

CDATA       
    : '<![CDATA[' .*? ']]>' 
    ;

DTD 
    : '<!' .*? '>'
    ;

SCRIPTLET 
    : '<?' .*? '?>'
    | '<%' .*? '%>'
    ;

SEA_WS
    :  (' '|'\t'|'\r'? '\n')+ 
    ;

SCRIPT_OPEN
    : '<script' .*? '>' ->pushMode(SCRIPT)
    ;

STYLE_OPEN
    : '<style' .*? '>'  ->pushMode(STYLE)
    ;

TAG_OPEN
    : '<' -> pushMode(TAG)
    ;

HTML_TEXT
    : ~'<'+
    ;   

//
// tag declarations
//
mode TAG;

TAG_CLOSE      
    : '>' -> popMode
    ;

TAG_SLASH_CLOSE     
    : '/>' -> popMode
    ;

TAG_SLASH      
    : '/' 
    ;

SCRIPT_TAG_OPEN
    : '<%' -> pushMode(SCRIPTVALUE)
    ;
//
// lexing mode for attribute values
//
TAG_EQUALS     
    : '=' -> pushMode(ATTVALUE)
    ;

TAG_NAME      
    : TAG_NameStartChar TAG_NameChar* 
    ;

TAG_WHITESPACE
    : [ \t\r\n] -> skip 
    ;

fragment
HEXDIGIT        
    : [a-fA-F0-9]
    ;

fragment
DIGIT           
    : [0-9]
    ;

fragment
TAG_NameChar        
    : TAG_NameStartChar
    | '-' 
    | '_' 
    | '.' 
    | DIGIT 
    |   '\u00B7'
    |   '\u0300'..'\u036F'
    |   '\u203F'..'\u2040'
    ;

fragment
TAG_NameStartChar
    :   [:a-zA-Z]
    |   '\u2070'..'\u218F' 
    |   '\u2C00'..'\u2FEF' 
    |   '\u3001'..'\uD7FF' 
    |   '\uF900'..'\uFDCF' 
    |   '\uFDF0'..'\uFFFD'
    ;

//
// <scripts>
//
mode SCRIPT;

SCRIPT_BODY
    : .*? '</script>' -> popMode
    ;

SCRIPT_SHORT_BODY
    : .*? '</>' -> popMode
    ;

//
// <styles>
//
mode STYLE;

STYLE_BODY
    : .*? '</style>' -> popMode
    ;

STYLE_SHORT_BODY
    : .*? '</>' -> popMode
    ;

//
// attribute values
//
mode ATTVALUE;

// an attribute value may have spaces b/t the '=' and the value
ATTVALUE_VALUE
    : [ ]* ATTRIBUTE -> popMode 
    ;

ATTRIBUTE
    : DOUBLE_QUOTE_STRING
    | SINGLE_QUOTE_STRING
    | ATTCHARS 
    | HEXCHARS
    | DECCHARS
    ;

fragment ATTCHAR
    : '-'
    | '_'
    | '.'
    | '/'
    | '+'
    | ','
    | '?'
    | '='
    | ':'
    | ';'
    | '#'
    | [0-9a-zA-Z]
    ;

fragment ATTCHARS
    : ATTCHAR+ ' '?
    ;

fragment HEXCHARS
    : '#' [0-9a-fA-F]+
    ;

fragment DECCHARS
    : [0-9]+ '%'?
    ;

fragment DOUBLE_QUOTE_STRING
    : '"' ~[<"]* '"'
    ;
fragment SINGLE_QUOTE_STRING
    : '\'' ~[<']* '\''
    ;

mode SCRIPTVALUE;

SCRIPT_TAG_VALUE
    : ATTCHARSCRIPTS*
    ;

SCRIPT_TAG_CLOSE
    : '%>' -> popMode
    ;

fragment ATTCHARSCRIPT
    : '-'
    | '_'
    | '.'
    | '/'
    | '+'
    | ','
    | '?'
    | '='
    | ':'
    | ';'
    | '#'
    | ')'
    | '('
    | '"'
    | '\r'
    | '\n'
    | ' '
    | [0-9a-zA-Z]
    ;

fragment ATTCHARSCRIPTS
    : ATTCHARSCRIPT* ' '?
    ;

**Parser Grammar**


parser grammar ASPParser;

options { tokenVocab=ASPLexer; }

htmlDocument    
    : (scriptlet | SEA_WS)* xml? (scriptlet | SEA_WS)* dtd? (scriptlet | SEA_WS)* htmlElements*
    ;

htmlElements
    : htmlMisc* htmlElement htmlMisc*
    ;

htmlElement     
    : TAG_OPEN htmlTagName htmlAttribute* scriptlettag* htmlAttribute* TAG_CLOSE htmlContent TAG_OPEN TAG_SLASH htmlTagName TAG_CLOSE
    | TAG_OPEN htmlTagName htmlAttribute* TAG_SLASH_CLOSE
    | TAG_OPEN htmlTagName htmlAttribute* TAG_CLOSE
    | scriptlet
    | script
    | style
    ;

htmlContent     
    : htmlChardata? ((htmlElement | xhtmlCDATA | htmlComment) htmlChardata?)*
    ;

htmlAttribute   
    : htmlAttributeName TAG_EQUALS htmlAttributeValue
    | htmlAttributeName
    | scriptlet
    ;

htmlAttributeName
    : TAG_NAME
    ;

htmlAttributeValue
    : ATTVALUE_VALUE
    ;

htmlTagName
    : TAG_NAME
    ;

htmlChardata    
    : HTML_TEXT 
    | SEA_WS
    ;

htmlMisc        
    : htmlComment 
    | SEA_WS
    ;

htmlComment
    : HTML_COMMENT
    | HTML_CONDITIONAL_COMMENT
    ;

xhtmlCDATA
    : CDATA
    ;

dtd
    : DTD
    ;

xml
    : XML_DECLARATION
    ;

scriptlet
    : SCRIPTLET
    ;

scriptlettag
    : SCRIPT_TAG_OPEN SCRIPT_TAG_VALUE SCRIPT_TAG_CLOSE
    ;

script
    : SCRIPT_OPEN ( SCRIPT_BODY | SCRIPT_SHORT_BODY)
    ;

style
    : STYLE_OPEN ( STYLE_BODY | STYLE_SHORT_BODY)
    ;

**Input File**

<!DOCTYPE html>
<html>
<%
dim cars
cars=Request.Form("cars")
%>
<body>
<form action="demo_radiob.asp" method="post">
<p>Please select your favorite car:</p>

<input type="radio" name="cars"
<% 
if cars="Volvo" then Response.Write("checked") 
%>
value="Volvo">Volvo</input>
<br>
<input type="radio" name="cars"
<% if cars="Saab" then Response.Write("checked") %>
value="Saab">Saab</input>
<br>
<input type="radio" name="cars"
<% if cars="BMW" then Response.Write("checked") %>
value="BMW">BMW</input>
<br><br>
<input type="submit" value="Submit" />
</form>
<%
if cars<>"" then
   Response.Write("<p>Your favorite car is: " & cars & "</p>")
end if
%>
</body>
</html>
EN

回答 1

Stack Overflow用户

发布于 2021-12-28 21:01:49

这个bug最终是固定在ANTLR。现在,ANTLR在生成时而不是在运行时报告EPSILON_CLOSURE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31193527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档