使用Javacc处理COBOL语法中的注释和行号/列号

使用Javacc处理COBOL语法中的注释和行号/列号,java,parsing,javacc,Java,Parsing,Javacc,我正在使用JavaCC开发一个COBOL解析器。COBOL文件通常将列1到6作为行号/列号。如果行号/列号不存在,则会有空格 我需要知道如何处理COBOL文件中的注释和序列区域,并只解析主区域 我试过很多表达,但都不管用。我创建了一个特殊的标记,用于检查新行,然后检查六个空格或除空格和回车符以外的任何字符,第七个字符之后的注释将为“*”,正常行将为“ 我正在使用这里提供的Cobol.jj文件 有人能建议我应该用什么语法吗 我的语法文件示例: PARSER_END(CblParser)

我正在使用JavaCC开发一个COBOL解析器。COBOL文件通常将列1到6作为行号/列号。如果行号/列号不存在,则会有空格

我需要知道如何处理COBOL文件中的注释和序列区域,并只解析主区域

我试过很多表达,但都不管用。我创建了一个特殊的标记,用于检查新行,然后检查六个空格或除空格和回车符以外的任何字符,第七个字符之后的注释将为
“*”
,正常行将为

我正在使用这里提供的Cobol.jj文件

有人能建议我应该用什么语法吗

我的语法文件示例:

    PARSER_END(CblParser)

////////////////////////////////////////////////////////////////////////////////
// Lexical structure
////////////////////////////////////////////////////////////////////////////////

SPECIAL_TOKEN :
{
  < EOL: "\n" > : LINE_START 
| < SPACECHAR: ( " " | "\t" | "\f" | ";" | "\r" )+ >
}

SPECIAL_TOKEN :
{
  < COMMENT: ( ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ) ( "*" | "|" ) (~["\n","\r"])* >
| < PREPROC_COMMENT: "*|" (~["\n","\r"])* >
| < SPACE_SEPARATOR : ( <SPACECHAR> | <EOL> )+ >
| < COMMA_SEPARATOR : "," <SPACE_SEPARATOR> >
}

<LINE_START> SKIP :
{
 < ((~[])(~[])(~[])(~[])(~[])(~[])) (" ") >
}
PARSER\u END(CblParser)
////////////////////////////////////////////////////////////////////////////////
//词汇结构
////////////////////////////////////////////////////////////////////////////////
特别代币:
{
:行\u开始
|
}
特别代币:
{

|
|
|<逗号分隔符:“,”>
}
跳过:
{
< ((~[])(~[])(~[])(~[])(~[])(~[])) (" ") >
}

由于解析器从行的开头开始,因此应该使用默认状态来表示行的开头。我将执行以下类似的操作[未测试的代码如下]

// At the start of each line, the first 6 characters are ignored and the 7th is used
// to determine whether this is a code line or a comment line.
// (Continuation lines are handled elsewhere.)
// If there are fewer than 7 characters on the line, it is ignored.
// Note that there will be a TokenManagerError if a line has at least 7 characters and
// the 7th character is other than a "*", a "/", or a space.
<DEFAULT> SKIP :
{
   < (~[]){0,6} ("\n" | "\r" | "\r\n") > :DEFAULT
|
   < (~[]){6} (" ") > :CODE
|
   < (~[]){6} ("*"|"/")  :COMMENT
}

<COMMENT> SKIP :
{   // At the end of a comment line, return to the DEFAULT state.
    < "\n" | "\r" | "\r\n" > : DEFAULT
|   // All non-end-of-line characters on a comment line are ignored.
    < ~["\n","\r"] > : COMMENT
}
<CODE> SKIP :
{   // At the end of a code line, return to the DEFAULT state.
    < "\n" | "\r" | "\r\n" > : DEFAULT
|   // White space is skipped, as are semicolons.
    < ( " " | "\t" | "\f" | ";" )+ >
}
<CODE> TOKEN :
{  
    < ACCEPT: "accept" >
|  
    ... // all rules for tokens should be in the CODE state.
}
//在每行的开头,前6个字符被忽略,第7个字符被使用
//确定这是代码行还是注释行。
//(续行在别处处理。)
//如果行中的字符少于7个,则忽略该行。
//请注意,如果一行至少包含7个字符,则会出现TokenManagerError
//第7个字符不是“*”、“/”或空格。
跳过:
{
<(~[]){0,6}(“\n”|“\r”|“\r\n”)>:默认值
|
<(~[]){6}(“”>:代码
|
<(~[]){6}(“*”|“/”):注释
}
跳过:
{//在注释行的末尾,返回默认状态。
<“\n”|“\r”|“\r\n”>:默认值
|//注释行上的所有非行尾字符都将被忽略。
<~[“\n”,“\r”]>:注释
}
跳过:
{//在代码行末尾,返回默认状态。
<“\n”|“\r”|“\r\n”>:默认值
|//跳过空白,分号也跳过。
<(“|”\t“|”\f“|”;”)+>
}
令牌:
{  

|  
…//令牌的所有规则都应处于代码状态。
}

我不认为分号应该被视为空格。我只是从Thiery Blind的解析器中复制。我做的一个小改动是将\r本身视为行的合法结尾(除非后面紧跟着一个“\n”)。