jj文件结构
/*第一部分*/
语法分析器的属性设置
/*第二部分*/
语法分析器的类声明
/*第三部分*/
词法规则声明
/*第四部分*/
语法规则实现
修改第二部分编写词法分析程序以文件流的形式输入
修改第三部分将部分词法规则写入
实例如下
jjt文件源代码
/**
* JJTree template file created by SF JavaCC plugin 1.5.17+ wizard for JavaCC 1.5.0+
*/
options
{
JDK_VERSION = "1.5";
static = true;
}
PARSER_BEGIN(EG2)
package qwer;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.io.FileNotFoundException;
public class EG2
{
public static void main(String args [])throws FileNotFoundException
{
File file=new File("src/input.txt");
Reader in=new FileReader(file);
SimpleCharStream scs=new SimpleCharStream(in);
EG2TokenManager ltm=new EG2TokenManager(scs);
try
{
Token token;
while(true)
{
token = ltm.getNextToken();
if(token.image=="")
{
break;
}
System.out.println(token.kind+" "+token.image);
}
}
catch(Exception e)
{
System.out.println("\u5f02\u5e38...");
System.out.println(e.getMessage());
}
}
}
PARSER_END(EG2)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
| < "//" (~[ "\n", "\r" ])*
(
"\n"
| "\r"
| "\r\n"
) >
| < "/*" (~[ "*" ])* "*"
(
~[ "/" ] (~[ "*" ])* "*"
)*
"/" >
}
TOKEN : /* KEYS */
{
< INT : "int" >
| < DOUBLE : "double" >
| < FLOAT : "float" >
| < CHAR : "char" >
| < VOID : "void" >
| < FOR : "for" >
| < WHILE : "while" >
| < RETURN : "return" >
| < IF : "if" >
| < MAIN:"main">
}
TOKEN : /* LITERALS */
{
< INTEGER_LITERAL :
< DECIMAL_LITERAL > ([ "l", "L" ])?
| < HEX_LITERAL > ([ "l", "L" ])?
| < OCTAL_LITERAL > ([ "l", "L" ])?
>
| < #DECIMAL_LITERAL : [ "1"-"9" ] ([ "0"-"9" ])* >
| < #HEX_LITERAL : "0" [ "x", "X" ] ([ "0"-"9", "a"-"f", "A"-"F" ])+ >
| < #OCTAL_LITERAL : "0" ([ "0"-"7" ])* >
}
TOKEN : /* OPERATORS */
{
< PLUS : "+" >
| < MINUS : "-" >
| < MULTIPLY : "*" >
| < DIVIDE : "/" >
| < ASSIGN : "=" >
| < GT : ">" >
| < LT : "<" >
| < EQUAL : "==" >
}
TOKEN : /* SEPARATER */
{
< QUATION : "\"" >
| < SEMICOLON : ";" >
| < BLBRACE : "{" >
| < BRBRACE : "}" >
| < LBRACE : "(" >
| < RBRACE : ")" >
| < COMMA : "," >
| < EXCLA_SYM : "!" >
}
TOKEN : /* IDENTIFIERS */
{
< IDENTIFIER :
< LETTER >
(
< LETTER >
| < DIGIT >
)* >
| < #LETTER : [ "_", "a"-"z", "A"-"Z" ] >
| < #DIGIT : [ "0"-"9" ] >
}
SimpleNode Start() :
{}
{
Program()
{
return jjtThis;
}
}
void Program() :
{}
{
< VOID>
< MAIN>
< LBRACE>
< RBRACE>
< BLBRACE>
(SentenceBlock())*
< BRBRACE>
}
void SentenceBlock():
{}
{
Sentence()
| < BLBRACE>
(SentenceBlock())*
< BRBRACE>
}
void Sentence() :
{}
{
SequenceSen()
| ConditionSen()
| LoopSent()
}
void SequenceSen() :
{}
{
[
AssigmentSen()
| DeclareSen()
]
< SEMICOLON>
}
void DeclareSen() :
{}
{
[
<INT>
| <DOUBLE>
| <FLOAT>
| <CHAR>
]
Identifier()
(<COMMA> Identifier())*
}
void AssigmentSen() :
{}
{
Identifier()
<ASSIGN>
Expression()
}
void ConditionSen() :
{}
{
<IF>
Condition()
SentenceBlock()
}
void LoopSent() :
{}
{
<WHILE>
Condition()
SentenceBlock()
}
void Condition() :
{}
{
"("
Expression()
Relations()
Expression()
")"
}
void Expression() :
{}
{
AdditiveExpression()
}
void AdditiveExpression() :
{}
{
MultiplicativeExpression()
(
(
"+"
| "-"
)
MultiplicativeExpression()
)*
}
void MultiplicativeExpression() :
{}
{
UnaryExpression()
(
(
"*"
| "/"
| "%"
)
UnaryExpression()
)*
}
void UnaryExpression() :
{}
{
"(" Expression() ")"
| Identifier()
| Integer()
}
void Identifier() :
{}
{
< IDENTIFIER >
}
void Integer() :
{}
{
< INTEGER_LITERAL >
}
void Relations() :
{}
{
<GT>
| <LT>
| <EQUAL>
}
结果展示: