http://www.anarres.org/projects/jcpp/
JCPP - A Java C Preprocessor
Introduction
The C Preprocessor is an interesting standard. It appears to be derived from the de-facto behaviour of the first preprocessors, and has evolved over the years. Implementation is therefore difficult. JCPP is a complete, compliant, standalone, pure Java implementation of the C preprocessor. It is intended to be of use to people writing C-style compilers in Java using tools like sablecc, antlr, JLex, CUP and so forth. This project has has been used to successfully preprocess much of the source code of the GNU C library. As of version 1.2.5, it can also preprocess the Apple Objective C library.
The license is Apache-2.0. Versions prior to 1.2.2 were licensed under GPL-2.0, but on the basis of representations received, the license has now changed. Subversion access is available on request. Less restrictive licenses are freely available on request, but please ask, because I want people to use this software, but I'm curious to know who is using it and for what purpose.
=================================================
jcpp : C 预编译器的 java 实现。
=================================================
代码中使用了模板。通过 vpp 任务将模板生成源代码的。
JCpp\etc\targets\global-vpp.xml
<vppcopy todir="${global.dir.build.java}">
<fileset dir="${global.dir.src.java}">
<include name="**/*.java" />
</fileset>
=================================================
通过 ant 编译后,build\java 目录下的代码是普通的 java 代码。
=================================================
程序运行后,可进行 c 语言预处理。如:
>#define aa 2
>aa
将输出 2。
=================================================
org/anarres/cpp/Main.java
if (g.getOptind() == args.length)
pp.addInput(new InputLexerSource(System.in));
通过这两行,将 System.in 做为输入。
=================================================
语法分析的代码在 LexerSource.java
public Token token()
throws IOException,
LexerException {
Token tok = null;
int _l = line;
int _c = column;
int c = read();
int d;
switch (c) {
case '\n':
//throw new RuntimeException("token() 582");
//System.out.println("token() 582");
if (ppvalid) {
bol = true;
if (include) {
tok = new Token(NL, _l, _c, "\n");
}
else {
int nls = 0;
do {
nls++;
d = read();
} while (d == '\n');
unread(d);
char[] text = new char[nls];
for (int i = 0; i < text.length; i++)
text[i] = '\n';
// Skip the bol = false below.
tok = new Token(NL, _l, _c, new String(text));
}
if (DEBUG)
System.out.println("lx: Returning NL: " + tok);
return tok;
}
/* Let it be handled as whitespace. */
break;
case '!':
tok = cond('=', NE, '!');
break;
case '#':
//System.out.println("token() 613");
if (bol)
tok = new Token(HASH);
else
tok = cond('#', PASTE, '#');
break;
case '+':
d = read();
if (d == '+')
tok = new Token(INC);
else if (d == '=')
tok = new Token(PLUS_EQ);
else
unread(d);
break;
case '-':
d = read();
if (d == '-')
tok = new Token(DEC);
else if (d == '=')
tok = new Token(SUB_EQ);
else if (d == '>')
tok = new Token(ARROW);
else
unread(d);
break;
case '*':
tok = cond('=', MULT_EQ, '*');
break;
case '/':
d = read();
if (d == '*')
tok = ccomment();
else if (d == '/')
tok = cppcomment();
else if (d == '=')
tok = new Token(DIV_EQ);
else
unread(d);
break;
case '%':
d = read();
if (d == '=')
tok = new Token(MOD_EQ);
else if (digraphs && d == '>')
tok = new Token('}'); // digraph
else if (digraphs && d == ':') PASTE: {
d = read();
if (d != '%') {
unread(d);
tok = new Token('#'); // digraph
break PASTE;
}
d = read();
if (d != ':') {
unread(d); // Unread 2 chars here.
unread('%');
tok = new Token('#'); // digraph
break PASTE;
}
tok = new Token(PASTE); // digraph
}
else
unread(d);
break;
case ':':
/* :: */
d = read();
if (digraphs && d == '>')
tok = new Token(']'); // digraph
else
unread(d);
break;
case '<':
if (include) {
tok = string('<', '>');
}
else {
d = read();
if (d == '=')
tok = new Token(LE);
else if (d == '<')
tok = cond('=', LSH_EQ, LSH);
else if (digraphs && d == ':')
tok = new Token('['); // digraph
else if (digraphs && d == '%')
tok = new Token('{'); // digraph
else
unread(d);
}
break;
case '=':
tok = cond('=', EQ, '=');
break;
case '>':
d = read();
if (d == '=')
tok = new Token(GE);
else if (d == '>')
tok = cond('=', RSH_EQ, RSH);
else
unread(d);
break;
case '^':
tok = cond('=', XOR_EQ, '^');
break;
case '|':
d = read();
if (d == '=')
tok = new Token(OR_EQ);
else if (d == '|')
tok = cond('=', LOR_EQ, LOR);
else
unread(d);
break;
case '&':
d = read();
if (d == '&')
tok = cond('=', LAND_EQ, LAND);
else if (d == '=')
tok = new Token(AND_EQ);
else
unread(d);
break;
case '.':
d = read();
if (d == '.')
tok = cond('.', ELLIPSIS, RANGE);
else
unread(d);
/* XXX decimal fraction */
break;
case '0':
/* octal or hex */
d = read();
if (d == 'x' || d == 'X')
tok = number_hex((char)d);
else {
unread(d);
tok = number_octal();
}
break;
case '\'':
tok = character();
break;
case '"':
tok = string('"', '"');
break;
case -1:
close();
tok = new Token(EOF, _l, _c, "<eof>");
break;
}
if (tok == null) {
if (Character.isWhitespace(c)) {
tok = whitespace(c);
}
else if (Character.isDigit(c)) {
tok = number_decimal(c);
}
else if (Character.isJavaIdentifierStart(c)) {
tok = identifier(c);
}
else {
tok = new Token(c);
}
}
if (bol) {
switch (tok.getType()) {
case WHITESPACE:
case CCOMMENT:
break;
default:
bol = false;
break;
}
}
tok.setLocation(_l, _c);
if (DEBUG)
System.out.println("lx: Returning " + tok);
// (new Exception("here")).printStackTrace(System.out);
return tok;
}
分享到:
相关推荐
这套C ++库将允许您使用与Java中相同的生态系统在C ++中进行开发:反射,轻松的对象编组,内存管理,... 发起这个项目是因为我想回答不同的需求: 我想用C ++开发。 我花了15年的时间使用Java,并且想再次使用C +...
《JCPP 1.4.3 与 Chinese-Utils:Java 开源库解析》 在IT行业中,开源项目是推动技术创新的重要力量。今天我们将聚焦于两个特定的开源库——"jcpp-1.4.3.zip" 和 "chinese-utils.zip"。这两个库分别为Java开发者...
而jcpp.zip则包含了一个名为jcpp-master的文件,这是一个Java实现的C预处理器,它允许开发者将C语言的预处理步骤转化为Java库。C预处理器(CPP)是C/C++编译过程中的第一步,它负责处理#include指令、宏定义以及其他...
标题 "JCPP2018:学校支持对青少年孤儿抑郁的影响" 暗示这是一个关于心理学研究的项目,特别是关注青少年孤儿的心理健康。这个研究可能分析了学校环境中的支持系统如何影响孤儿的抑郁症状。JCPP可能代表"Journal of ...
JCPP,全称为Java-to-C++桥接库,是一个针对C++编程语言设计的开源项目,旨在为C++开发者提供一个能够在C++环境中实现Java类功能的工具集。这个库使得C++程序员可以利用Java的一些特性,如面向对象编程、垃圾回收...
JCPP则是一个C语言的预处理器,它扩展了C语言,允许开发者使用类似C++的特性,如类、模板和命名空间,但编译为标准C代码,可以在各种平台上运行。 "速度预处理器的gradle插件"暗示这个插件优化了预处理过程,可能...
**Java HighCharts 实例详解** Java HighCharts是一个用于在Java应用程序中展示图表的库,它允许开发者通过Java代码创建各种动态、交互式的图表。HighCharts本身是一个JavaScript库,但通过Java封装,使得开发者...
Java程序设计语言是一种广泛应用于现代计算的面向对象的语言,它以其跨平台的特性、高效性和安全性赢得了全球开发者的青睐。1995年,Sun Microsystems公司发布Java,旨在创造一种能够在互联网环境中无缝运行的编程...
在Java编程领域,程序性能优化是一项至关重要的任务,它直接影响到软件的运行效率、资源消耗以及用户体验。"Java程序性能优化"这个主题涵盖了多种技术与策略,旨在提升Java应用程序的运行速度,减少内存占用,以及...
JCPP ( ) 到 C# 的快速和肮脏的端口,具有支持 Clang 预处理的功能。 从 jcpp 添加的功能: __has_include, __has_include_next, __has_feature 可变参数宏 #进口 var pp = new Preprocessor (); pp . add...
无论您是需要完成Java项目还是提交第一个HTML网页,还是在Java程序中将Java程序执行到Java IDE中时是否需要用C语言编写代码,JCppEdit都将帮助您轻松实现目标。 探索项目并检测代码中的错误要容易得多。 您不会在...
在Java编程语言的背景下,本书深入剖析了各种中间件技术及其在实际应用中的作用,旨在帮助读者理解和掌握如何设计和实现复杂的分布式系统。 分布式架构是现代大型网站系统的核心,它允许通过在网络上的多台计算机上...
首先,Swagger的核心组件是`Swagger-core`,它提供了注解,允许我们在Java代码中声明API的元数据。在Spring MVC项目中,我们需要引入Swagger的相关依赖。这通常通过在`pom.xml`文件中添加Maven依赖来实现: ```xml ...
在Java开发过程中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,定位问题。Log4j是一个广泛使用的日志记录框架,而Apache Kafka则是一个分布式流处理平台,常用于实时数据传输。当我们需要将Log4j...
Apache DbUtils是一个由Apache软件基金会开发的开源Java库,它主要设计用于简化JDBC(Java Database Connectivity)操作。DbUtils库提供了一套实用工具方法,能够帮助开发者更高效、更安全地执行数据库操作,避免了...
在现代Web开发中,前端与后端的交互是不可或缺的一部分,而Vue.js作为一个轻量级、灵活且功能强大的前端框架,常与Spring Boot这样的后端Java框架结合使用。本项目"vuespringboot.rar"提供了使用Vue.js和Spring Boot...
1. **多语言支持**:ICE支持多种编程语言,如C++, Java, Python等,使得不同语言间的交互变得容易。 2. **二进制协议**:ICE使用高效的二进制协议进行通信,提高了数据传输速度和网络性能。 3. **接口定义语言...
在Spring Boot应用中,多数据源的实现是一个常见的需求,特别是在大型系统中,可能需要连接到不同的数据库以满足不同业务场景的需求。本实例是关于如何在Spring Boot项目中配置和管理多个数据源的实践,通过注解的...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。而Spring框架则是Java领域中广泛使用的依赖注入(DI)和面向切面编程(AOP)框架。当...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。张开涛老师的Shiro学习资料是许多开发者入门和深入理解Shiro的宝贵资源。下面将详细...