Antlr4的领域驱动语言实战

本文探讨了在业务开发中遇到的繁琐问题,如复杂的流程、需求变更带来的困扰,以及如何通过语法和自动化工具解决这些问题。通过定义一系列操作语法,实现对人员的定义、删除、指责、踢除和拥抱等功能,简化了业务流程,并利用ANTLR工具生成相应的访客,以实现高效自动化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蛋疼的业务功能、蛋疼的流程、蛋疼的需求变更.....

彻底地被折磨得不成人样,更加让我无法忍受的是,看着大家代码无数的圈复杂度,一层层地写if、else等逻辑处理语句,来进行控制业务功能的,但是被动的是,你就再怎么细心,也不可能覆盖到所有的测试用例。

这里讲了一个领域的,是定义人类-》删除-》责骂-》剔除-》拥抱,编写g4文件

grammar PersonableGrammar;

prog:   stat+ ;

stat:   expr NEWLINE?               # printExpr
    |   NEWLINE             # blank
    ;

expr: DEF ID 						# DefinePerson
	| REM ID  						# RemovePerson
	| BLAME ID 						# BlamePerson
	| KICK ID 						# KickPerson
	| HUG ID 						# HugPerson
	;

//people actions
DEF : 'define' ;
REM : 'remove' ;
BLAME: 'blame' ;
HUG: 'hug' ;


ID  :   [a-zA-Z]+ ;     
INT :   [0-9]+ ;        
NEWLINE:'\r'? '\n' ;    
WS  :   [ \t]+ -> skip ; // toss out whitespace
LINE_COMMENT : '//' .*? '\r'? '\n' -> skip ; // Match "//" stuff '\n'

 使用antlrwork生成visitor,实现其接口

public class PersonableVistorImpl extends PersonableGrammarBaseVisitor{

	ArrayList<String> personList = new ArrayList<String>();

	@Override
	public String visitPrintExpr(@NotNull PersonableGrammarParser.PrintExprContext ctx) {
		String value = String.valueOf(visit(ctx.expr()));
		System.out.println(value);
		return value;
	}

	@Override
	public String visitDefinePerson(@NotNull PersonableGrammarParser.DefinePersonContext ctx) {
		String value = String.valueOf(ctx.ID());
		System.out.println("++ Defining "+value);

		personList.add(value);
		return personList.toString();
	}

	@Override
	public Object visitRemovePerson(@NotNull PersonableGrammarParser.RemovePersonContext ctx) {
		String value = String.valueOf(ctx.ID());
		personList.remove(value);
		return personList.toString();
	}

	@Override
	public String visitBlamePerson(@NotNull PersonableGrammarParser.BlamePersonContext ctx) {
		String value = String.valueOf(ctx.ID());
		if (!personList.contains(value)){
			System.out.println("++ You must define a person before blaming him or her.");
			return personList.toString();
		}

		//do something to blame person
		System.out.println("++ It's all "+value+"'s fault.");
		return personList.toString();

	}

	@Override
	public String visitHugPerson(@NotNull PersonableGrammarParser.HugPersonContext ctx) {
		String value = String.valueOf(ctx.ID());
		if (!personList.contains(value)){
			System.out.println("++ You must define a person before Hugging him or her.");
			return personList.toString();
		}

		//do something to hug person
		System.out.println("Giving " +value +" a hug.");
		return personList.toString();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值