我在NetBeans中创建自定义文件时遇到问题。我有两种类型的多行注释类型:
/*
开头,结束*/
<!--
开头,结束-->
MORE :
{
"/*": XSCRIPT_COMMENT
|
"<!--": XML_COMMENT
}
<XSCRIPT_COMMENT>
TOKEN :
{
<X_SCRIPT_COMMENT_END: "*/" > : DEFAULT
}
<XML_COMMENT>
TOKEN :
{
<XML_COMMENT_END: "-->" > : DEFAULT
}
<XSCRIPT_COMMENT,XML_COMMENT>
MORE :
{
< ~[] >
}
问题是,当我编写评论的初始部分(TokenMgrError
或/*
)时,两行多行注释都会抛出<!--
。仅当没有结束部分且词法分析器到达文件末尾时才会发生错误。
我的目标是创建多行注释,其作用类似于其他注释类型(当只写入初始部分时,文档的其余部分是注释类型文本)。
请原谅我的英语,而不是我的母语。
答案 0 :(得分:4)
对我来说,MartinZ的aswer也解决了JavaCC词汇问题。
{ <COMMENT: "/*" (~["*"])* |
"/*" (~["*"])* "*" (~["/"])* |
"/*" (~["*"])* "*" (~["/"])* "/" > }
答案 1 :(得分:0)
一种方法是使用单个正则表达式来匹配注释。例如a / * .. * /
可以匹配多行评论"/*" (("*")* ~["*"])* ("*" ("*")* "/"?)?
这里我做了最后的“* /”可选。 (根据我的经验,提出这种正则表达式的最佳方法是将NDFA转换为RE,如果你知道如何做到这一点。)
另一种方法是允许空字符串结束注释。添加这两个规则。
<XML_COMMENT> TOKEN : { <XML_COMMENT_END: "" > : DEFAULT }
<XSCRIPT_COMMENT> TOKEN : { <X_SCRIPT_COMMENT_END: "" > : DEFAULT }
答案 2 :(得分:0)
通过不同的正则表达式解决。首先,我用笔和纸创建了确定性自动机,但图形视图总是最好的。
<XSCRIPT_COMMENT:
"/*" (~["*"])*
|
"/*" (~["*"])* "*" (~["/"])*
|
"/*" (~["*"])* "*" (~["/"])* "/"
>
<XML_COMMENT:
"<!--" (~["-"])*
|
"<!--" (~["-"])* "-" (~["-"])*
|
"<!--" (~["-"])* "-" (~["-"])* "-" (~[">"])*
|
"<!--" (~["-"])* "-" (~["-"])* "-" (~[">"])* ">"
>
我意识到这两个表达式都不是来自最小化的DFA,但是像这样,它更容易理解。