You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaCC中测试偶数匹配Token及代码实现咨询

问题解答

一、修正偶数Token的定义

你当前的Token定义可以简化得更严谨,同时确保只匹配以偶数结尾的数字(包括单个偶数数字):

TOKEN: // 仅匹配偶数数字
{
  <TOKENPARANUMEROSPARES: (["0"-"9"])* ["02468"] >
}

注:["02468"]等价于你写的("0"|"2"|"4"|"6"|"8"),用字符集写法更简洁。

二、测试Token的具体方法

要验证这个Token是否生效,需要编写驱动代码来运行解析器,步骤如下:

  1. 先添加一个入口解析方法,让解析器知道从哪里开始执行:
void start():
{}
{
  llamarNumeroPar()
}
  1. 添加main方法作为程序入口,输入测试文本并触发解析:
public static void main(String[] args) throws ParseException {
  // 替换为你的解析器类名(和JavaCC文件名一致)
  EvenNumberParser parser = new EvenNumberParser(System.in);
  try {
    parser.start();
    System.out.println("输入是合法偶数");
  } catch (ParseException e) {
    System.out.println("输入不是偶数或格式错误");
  }
}

测试时,运行生成的Java类:输入偶数(如1234、0)会触发解析成功逻辑;输入奇数(如123)或非数字内容会抛出解析异常,执行错误提示。

三、输出提示信息的位置选择

两种实现方式都可行,按需选择:

  • 在Token/解析动作中输出:像你现在写的{System.out.println("Soy un numero par");},优点是匹配到Token时立刻输出,适合快速调试;缺点是把输出逻辑和解析逻辑耦合,不利于后续维护扩展。
  • 在main方法中输出:更推荐这种解耦的写法,把解析和业务输出分开。比如修改解析方法返回匹配结果,再在main里统一处理输出:
    String llamarNumeroPar (): 
    {}
    {
      <TOKENPARANUMEROSPARES> { return token.image; }
    }
    
    对应的main方法:
    public static void main(String[] args) throws ParseException {
      EvenNumberParser parser = new EvenNumberParser(System.in);
      try {
        String matchedEven = parser.start();
        System.out.println("soy un numeroPar: " + matchedEven);
      } catch (ParseException e) {
        System.out.println("输入不是有效偶数");
      }
    }
    

内容的提问来源于stack exchange,提问作者Avalon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:12:41