`
cywhoyi
  • 浏览: 420997 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Antlr4的领域驱动语言实战

    博客分类:
  • JAVA
 
阅读更多

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

彻底地被折磨得不成人样,更加让我无法忍受的是,看着大家代码无数的圈复杂度,一层层地写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();
	}
}

 

0
0
分享到:
评论

相关推荐

    基于ANTLR4的CMM语言编译器

    ANTLR4是一种强大的解析器生成器,广泛用于构建语言、工具和框架。它能够读取、处理、执行或翻译结构化文本或二进制文件。在本项目“基于ANTLR4的CMM语言编译器”中,开发人员使用ANTLR4来创建了一个针对CMM(可能是...

    The Definitive ANTLR 4 Reference.pdf

    它广泛应用于构建语言、工具和框架,从脚本语言和配置文件到DSL(领域特定语言)和嵌入式语法。ANTLR 4生成的解析器基于LL(*)解析算法,具有强大的错误恢复和错误报告能力,使其在处理语法错误时具有更高的灵活性。 ...

    java Antlr 4 语法文件合集

    Java Antlr 4 是一个强大的解析工具,用于生成解析器和词法分析器,它使得开发者可以轻松地处理各种语言的语法。Antlr 4 支持多种编程语言,包括 Java,C#,Python,JavaScript 等,而在这个“java Antlr 4 语法文件...

    antlr4权威指南

    antlr4权威指南,适合想要构建自己的语言的同学,使用antlr4构建更方便

    基于 Antlr4 的 Hive SQL 解析.zip

    在本课程设计中,主题是“基于Antlr4的Hive SQL解析”,这涉及到了两个主要的技术领域:Antlr4和Hive SQL。Antlr4是一个强大的解析工具,用于生成解析器和词法分析器,它能处理各种语言的语法,包括SQL。而Hive SQL...

    antlr4入门例子

    4. **运行示例**:在"hello-antlr4"目录下,可能有一个简单的Java或Python程序,用来驱动ANTLR4生成的解析器和词法分析器。这个程序会读取输入(比如标准输入或文件),进行词法分析和语法解析,然后可能打印出解析...

    The Definitive ANTLR 4 Reference.pdf_antlr_

    5. **目标语言支持**:ANTLR 4支持多种目标语言,包括Java、C#、Python、JavaScript等,生成的解析器可以在这些语言环境中运行。 6. **可视化调试**:ANTLR 4提供了一个名为ANTLRWorks的图形化调试工具,可以直观地...

    The Definitive ANTLR 4 Reference

    此外,ANTLR 4支持多种编程语言作为目标代码,如Java、C++、Python等,这意味着它可以在不同的开发环境中被应用。 在学习ANTLR 4的过程中,了解如何设计高效的语法文件是至关重要的。语法文件是ANTLR 4解析过程的...

    DSL领域定制语言实战

    本书是第一本领域专用语言(DSL)的实战类图书,它面向真正的实践者,是一本让奋战在开发第一线的实干家备感实用的专著! 《领域专用语言实战》基于一系列JVM语言(Java、Ruby、Groovy、Scala和Clojure),分析了...

    开源项目-antlr-antlr4.zip

    总结起来,"antlr4-antlr4.zip"是一个用于Go语言的ANTLR4解析器生成器的初期版本,它为开发者提供了强大的语言解析能力,可用于构建各类解析相关工具和应用。开发者可以借此深入学习解析理论,实践语言解析技术,并...

    antlr4-runtime-4.2-API文档-中文版.zip

    赠送jar包:antlr4-runtime-4.2.jar; 赠送原API文档:antlr4-runtime-4.2-javadoc.jar; 赠送源代码:antlr4-runtime-4.2-sources.jar; 赠送Maven依赖信息文件:antlr4-runtime-4.2.pom; 包含翻译后的API文档:...

    应用ANTLR实现过程式语言操作语义的动态演示

    ANTLR 是一个强大的解析器生成器,常用于构建语言、工具和框架。它特别适用于解析结构化文本或二进制文件,比如编程语言、配置文件、通信协议等。ANTLR 支持多种目标语言,如Java、C#、Python等,使得生成的解析器...

    antlr4-4.5

    ANTLR4在编译原理领域具有重要地位,因为它能够自动生成解析器和词法分析器,使得开发者无需从零开始构建这些复杂组件。 ANTLR4的核心功能包括: 1. **语法定义**:ANTLR4支持基于EBNF(扩展巴科斯范式)的语法...

    antlr4-master 源码

    总之,深入学习ANTLR4的源码,不仅可以帮助我们成为ANTLR4的专家,也能加深对解析理论、编译器构造和语言设计的理解。这是一项有价值且富有挑战性的任务,对于任何从事相关领域工作的人来说都是一个宝贵的资源。

    编译原理学习框架antlr4

    ANTLR4支持多种目标语言,如Java、C#、Python等,使得生成的解析器可以跨平台运行。 在编译原理的学习中,ANTLR4扮演了核心角色。编译器是将高级语言转换为机器语言的程序,这一过程分为词法分析、语法分析、语义...

    Antlr4 C++ 计算器

    总之,"Antlr4 C++ 计算器"是一个学习ANTLR4和语言解析技术的好起点,它展示了如何使用ANTLR4生成的解析器和词法分析器在C++环境中解析和执行数学表达式。通过深入理解和实践这个项目,你可以提升对编译原理和语言...

    antlr4权威指南中文版

    antlr4权威指南中文版,原书作者terence Parr,清晰版本

    The Definitive ANTLR4Reference 学习笔记

    ANTLR 4是ANTLR系列的最新版本,它提供了对现代编程语言语法模式的全面支持,并具有强大的错误恢复机制。 学习ANTLR 4的参考手册时,首先需要了解的是语言、语法、解析树、词法单元和解析器的基本概念。语言由一...

Global site tag (gtag.js) - Google Analytics