如何在JavaCC中测试偶数匹配Token及代码实现咨询
问题解答
一、修正偶数Token的定义
你当前的Token定义可以简化得更严谨,同时确保只匹配以偶数结尾的数字(包括单个偶数数字):
TOKEN: // 仅匹配偶数数字 { <TOKENPARANUMEROSPARES: (["0"-"9"])* ["02468"] > }
注:["02468"]等价于你写的("0"|"2"|"4"|"6"|"8"),用字符集写法更简洁。
二、测试Token的具体方法
要验证这个Token是否生效,需要编写驱动代码来运行解析器,步骤如下:
- 先添加一个入口解析方法,让解析器知道从哪里开始执行:
void start(): {} { llamarNumeroPar() }
- 添加
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里统一处理输出:
对应的main方法:String llamarNumeroPar (): {} { <TOKENPARANUMEROSPARES> { return token.image; } }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
相关产品推荐
相关产品推荐

