编译原理——词法分析

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>
}

结果展示:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值