标签: preprocessor

C风格:宏还是预处理器?

我已经编写了一个库来匹配一组模式的字符串,现在我可以轻松地将词汇扫描程序嵌入到C程序中.

我知道有许多成熟的工具可用于创建词法扫描程序(lex和re2c,仅列出前两个想到的)这个问题不是关于词法分析器,而是关于"扩展"C语法的最佳方法.词法分析器示例只是一个普遍问题的具体案例.

我可以看到两种可能的解决方案

  1. 编写一个预处理器,将带有嵌入词法分析器的源文件转换为普通的C文件,并可能转换为要在编译中使用的一组其他文件.
  2. 编写一组C宏来以更易读的形式表示词法分析器.

我已经做过两个但问题是:"你会根据以下标准考虑哪一个更好的做法?"

  • 可读性.词法分析器逻辑应清晰易懂
  • 可维护性.找到并修复bug不应该是一场噩梦!
  • 构建过程中的干扰.预处理器在构建过程中需要额外的步骤,预处理器必须在路径等中等.

换句话说,如果你不得不维护或编写一个使用这两种方法之一的软件,那么一个人会不会让你失望?

例如,以下是针对以下问题的词法分析器:

  • 求和所有数字(可以是十进制形式,包括像1.3E-4.2那样的指数)
  • 跳过字符串(双引号和单引号)
  • 跳过列表(类似于LISP列表:(3 4(0 1)()3))
  • 在遇到单词end(case无关紧要)或缓冲区末尾时停止

在两种风格.

/**** SCANNER STYLE 1 (preprocessor) ****/
#include "pmx.h"

t = buffer

while (*t) {
  switch pmx(t) { /* the preprocessor will handle this */
    case "&q" :         /* skip strings */
      break; 

    case "&f<?=eE>&F" : /* sum numbers */ 
      sum += atof(pmx(Start,0));
      break;

    case "&b()":        /* skip lists */
      break;

    case "&iend" :      /* stop processing */ …
Run Code Online (Sandbox Code Playgroud)

c macros preprocessor c-preprocessor

4
推荐指数
1
解决办法
1614
查看次数

如何在预处理时区分出ERTS版本?

在最近的Erlang R14中,inets的文件httpd.hrl已被移除:

src/httpd.hrl
Run Code Online (Sandbox Code Playgroud)

至:

src/http_server/httpd.hrl
Run Code Online (Sandbox Code Playgroud)

二郎的Web框架,包括使用以下指令几个地方的文件:

-include_lib("inets/src/httpd.hrl").
Run Code Online (Sandbox Code Playgroud)

因为我喜欢Erlang Web用两个版本的Erlang(R13和R14)进行编译,所以理想情况下我需要的是:

-ifdef(OLD_ERTS_VERSION).
-include_lib("inets/src/httpd.hrl").
-else.
-include_lib("inets/src/http_server/httpd.hrl").
-endif.
Run Code Online (Sandbox Code Playgroud)

即使可以通过以下方式检索ERTS版本:

erlang:system_info(version).
Run Code Online (Sandbox Code Playgroud)

这在预处理时确实是不可能的.

如何处理这些情况?解析变换是唯一的方法吗?还有更好的选择吗?

erlang preprocessor

4
推荐指数
1
解决办法
795
查看次数

连字预处理

我需要一些线索来使用PHP和/或Java(当前为Spring + Hibernate)中的工具来进行内容的断字。我在包含的文件中有一些文本内容,而在数据库中有一些。所有文本都是utf-8编码的,我需要使用软连字符作为支持,这在大多数浏览器中都很常见。

因此,此存储原始:

<p> These words need hyphenation</p>
Run Code Online (Sandbox Code Playgroud)

会变成这样的东西

<p> The&shy;se wor&shy;ds need hyp&shy;he&shy;na&shy;tion</p>
Run Code Online (Sandbox Code Playgroud)

在最终加载的网页的源代码中。

任何想法如何实现这一目标?

对于没有使用服务器端代码且仅使用纯HTML源文件的情况,也欢迎使用HTML标记内包含连字符的文本编辑工具的建议。

另外,我还没有找到连字单词列表的良好来源。

php java preprocessor hyphenation

4
推荐指数
1
解决办法
2100
查看次数

Delphi的条件编译是否允许定义的符号包含值?

在Delphi中,您可以定义符号,就像在C/C++中一样.

德尔福:

{$DEFINE MY_SYMBOL}
Run Code Online (Sandbox Code Playgroud)

C/C++:

#define MY_SYMBOL
Run Code Online (Sandbox Code Playgroud)

这允许您通过{$IFDEF MY_SYMBOL}在Delphi或#ifdef MY_SYMBOLC/C++中使用来检查符号是否已定义.

这是一个布尔值 - 符号是在预处理期间定义的.但是,C/C++还允许您为预处理器符号赋值.例如:

#ifdef DEBUG
#define DB_HOST "127.0.0.1"
#else
#define DB_HOST "123.456.789.123"
#endif

Database *pDatabase = new Database(DB_HOST);
Run Code Online (Sandbox Code Playgroud)

是否可以在Delphi中为预处理器符号赋值,或者Delphi是否仅允许您确定是否已定义符号?

编辑:由于Delphi不支持预处理器中的符号,我假设它不支持预处理器.我在这个假设中是对的吗?

例如,在C中,您可以定义一个预处理器宏,在编译之前将其与适当的参数一起复制和粘贴.当您希望"内联函数"功能用于快速操作(例如,二进制逻辑,在整数值中测试,位移等)而没有堆栈帧的开销,参数传递等时,这非常有用.

#define OK_FLAG 0x00000001
#define OK(f) (f & OK_FLAG)

#define WEAK_XOR_CIPHER(v) (v ^ 0xff)
Run Code Online (Sandbox Code Playgroud)

delphi macros preprocessor symbols

4
推荐指数
1
解决办法
2325
查看次数

gulp - 在缩小CSS时排除文件

我是Gulp的新手..我已经能够成功安装和连接并缩小我的.js和.css文件,但是,有一个我要排除的.css文件 - print.css

我按照这里的说明操作:https://www.npmjs.org/package/gulp-ignore在我的本地目录中安装gulp-ignore,并将我的gulpfile.js修改为:

// Include gulp
var gulp = require('gulp'); 

// Include Our Plugins
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var minifyCSS = require('gulp-minify-css');
var imagemin = require('gulp-imagemin');
var exclude = require('gulp-ignore').exclude;


var paths = {
  scriptsNonAuth: ['Non-Auth/javascript/*.js'],
  scriptsAuth: ['Auth/javascript/*.js'],
  stylesNonAuth: ['Non-Auth/css/*.css'],
  stylesAuth: ['Auth/css/*.css'],
};

// CSS Task - Non Authenticated
gulp.task('minify-css-non-auth', function() {
  gulp.src(paths.stylesNonAuth)
    .pipe(minifyCSS(opts))
    .pipe(concat('all.min.css'))
    .pipe(gulp.dest('Non-Auth/css'))
});

// CSS Task - Authenticated
gulp.task('minify-css-auth', function() { …
Run Code Online (Sandbox Code Playgroud)

javascript optimization preprocessor gulp

4
推荐指数
1
解决办法
1万
查看次数

如何查看sklearn.preprocessing.PolynomialFeatures的效果?

如果我有中等数量的基本特征并从中生成中等阶数的多项式特征,那么弄不清楚特征数组的哪一列preprocess_XX对应于基本特征的哪种转换可能会引起混淆。

我以前使用sklearn的旧版本(也许是0.14?)执行以下操作:

import numpy as np
from sympy import Symbol
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(4)
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
XX = np.random.rand(1000, 3)  # replace with the actual data array
preprocess_symXX = poly.fit_transform([x1, x2, x3])
preprocess_XX = poly.fit_transform(XX)
print preprocess_symXX
Run Code Online (Sandbox Code Playgroud)

太棒了 它会产生类似的输出[1, x1, x2, x3, x1**2, ... ],这会让我知道列的preprocess_XX实际多项式函数来自哪里。

但是现在,当我这样做时,它会抱怨TypeError: can't convert expression to float。引发此异常的原因是sklearn.utils.validation调用了一个函数check_array(),该函数试图将输入转换poly.fit_transform()dtype=float

您是否有建议,如何看待基本特征的多项式与输出中的哪一列相对应,而fit_transform()?现在 …

python preprocessor sympy scikit-learn

4
推荐指数
1
解决办法
832
查看次数

如何使用Clang作为预处理器

我正在做论文,我必须将源代码解析并标记为单个函数.对于每个函数,我想提取类型的名称,称为函数名称和类型转换.铿锵声是这种工作的正确工具吗?如果是,我该怎么做?

下面是一个简单的C函数.粗体是我想要的提取项目:

static char func1(unsigned int a, struct foo *b)
{
    int c = 0;
    struct bar *d;

    if (a == 0) {
        d = func2((int) a);
    } else {
        c = func3((struct bar *) b);
    }

    return c;
}

preprocessor llvm lexer llvm-clang

4
推荐指数
1
解决办法
2736
查看次数

添加sourceSet时已设置endPosTable

我正在使用自定义注释处理器并遇到一个新问题.我正在使用Gradle(3.1.1),当我将处理器生成的文件路径添加到sourceSet时,我会遇到奇怪的问题.

gradle clean build然后我执行了一个gradle build后来的构建得到了摧毁.我得到的堆栈跟踪是一个非常常见的令我惊讶的.

An exception has occurred in the compiler (1.8.0_91). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.lang.IllegalStateException: endPosTable already set
    at com.sun.tools.javac.util.DiagnosticSource.setEndPosTable(DiagnosticSource.java:136)
    at com.sun.tools.javac.util.Log.setEndPosTable(Log.java:350)
    at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:667)
    at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:950)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.<init>(JavacProcessingEnvironment.java:892)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.next(JavacProcessingEnvironment.java:921)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1187)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at com.sun.tools.javac.main.Main.compile(Main.java:523)
    at com.sun.tools.javac.main.Main.compile(Main.java:381)
    at com.sun.tools.javac.main.Main.compile(Main.java:370)
    at …
Run Code Online (Sandbox Code Playgroud)

java eclipse preprocessor gradle

4
推荐指数
2
解决办法
2312
查看次数

将#elif与#ifdef一起使用是否合法?

一个简单的问题,谷歌没有帮助我.在C++中使用#elif上下文中的子句是否合法#ifdef?它似乎与c ++ 11模式(MSVC 2015/2017,clang,GCC)中的所有主要编译器一样编译和工作,但我不确定它是否符合标准.

c++ preprocessor c-preprocessor preprocessor-directive

4
推荐指数
3
解决办法
2713
查看次数

-unid = c ++ 11未定义“ unix” C ++预处理程序宏

unixpreproc.cpp

#ifdef unix
#warning "unix is defined"
#endif

#ifdef __unix__
#warning "__unix__ is defined"
#endif

void main() {}
Run Code Online (Sandbox Code Playgroud)

使用Intel C ++编译器19.0.3:

icpc -o unixpreproc unixpreproc.cpp显示同时定义了unix__unix__

icpc -std=c++11 -o unixpreproc unixpreproc.cpp显示仅__unix__已定义。这是故意的吗?它没有记录在英特尔编译器手册中

c++ unix preprocessor icc c++11

4
推荐指数
2
解决办法
103
查看次数