小编Fin*_*ent的帖子

Commons CLI中不带选项名称的必选参数

我正在尝试将Java中的命令行参数解析为以下用法:

Usage: gibl FILE
 -h,  --help      Displays this help message.
 -v,  --version   Displays the program version.
 FILE             Source file.
Run Code Online (Sandbox Code Playgroud)

使用Apache Commons CLI库,我知道我可以选择使用Option来解析-h-v命令,然后使用CommandLine.getArgs()来获取剩余的参数FILE,然后根据需要进行解析,但实际上我想将其指定为OptionCLI中的一个。

目前,我执行以下操作:

if (cmd.getArgs().length < 1) {
    System.out.println("Missing argument: FILE");
    help(1); // Prints the help file and closes the program with an exit code of 1.
}
String file = cmd.getArgs()[0];
Run Code Online (Sandbox Code Playgroud)

但是,当我调用HelpFormatter.printHelp(String, Options)我的额外参数时,它不会包含在自动生成的帮助文本中。

我所追求的是这样的:

Option file = new Option("Source file.");
file.setRequired(true);
options.addOption(file);
Run Code Online (Sandbox Code Playgroud)

我有一个参数,但没有附加相应的选项标识符的地方,因此可以将其传递给 …

java apache-commons-cli

7
推荐指数
2
解决办法
3293
查看次数

为JVM编写语言

假设我写了一种编程语言;对于同名,我将其称为lang

为了开始编写lang的漫长旅程,我决定从自己编写lang开始。我实际上不能运行它,因为没有什么可以运行自己运行的程序。

因此,我首先使用Java 为lang编写另一个编译器。这次,当我完成后,我决定将其转换为Bytecode,然后保留它。我现在有一个正在运行的编译器,它将把我所有的lang代码转换为Bytecode。

因此,我决定将自己的语言编译器插入我刚用Java编写的编译器中。然后,我将自编译器转换为Bytecode,然后剔除Java编译器。现在,我有了一个纯粹由自己编写的lang编译器,可以将其转换为Bytecode,以备使用。

这样就创建了一个可靠的程序,我理解了所有这些内容,但是我的问题是,相对于JVM的编译器设计,如果决定发布针对该语言的更新该怎么办?我该如何更新字节码?我是否只用旧版本重写了该语言的更新版本?

我问这是因为这是我想要做的。自己编写一种不存在的语言,然后通过首先使用Java创建编译器将其引导到JVM。

这与使用C ++所做的相同。先编写带有类的C,然后再编写C ++,最后,将带有类的C替换为自举的C ++。但是他们到底是怎么更新语言的呢?

java compiler-construction jvm jvm-bytecode

5
推荐指数
1
解决办法
189
查看次数

C++中的Python风格变量

我正在研究一个C++项目,并试图弄清楚如何制作一个"动态"变量.

在Python中,变量可以有多种类型:

variable = 0
variable = "Hello"
Run Code Online (Sandbox Code Playgroud)

在Java中,这也是(有些)可以实现的:

Object o = 0;
o = "Hello";
Run Code Online (Sandbox Code Playgroud)

从我能找到的与C++相关的内容中,没有object类型或"动态"对象.

我需要这样的原因,是我试图创建一个对象这需要在以下任一类型: int,float,char,string,bool,和让我做操作,如:

object o = 0; // currently an int
o -= 2.5; // now a float
o += "Test"; // now a string
Run Code Online (Sandbox Code Playgroud)

这种变量有默认功能吗?如果没有,可以用宏struct,等等吗?

我发现了这样的事情:

template <typename name>
Run Code Online (Sandbox Code Playgroud)

但不知道如何使用它.

c++ python types strong-typing type-safety

3
推荐指数
1
解决办法
172
查看次数

子类不需要父构造函数

我在Eclipse编程,发现了一些奇怪的东西......

如果我创建一个这样的类:

public abstract class Test {
    public Test(Object obj) {}
}
Run Code Online (Sandbox Code Playgroud)

任何儿童班显然都需要super()填写.

同样适用于:

public abstract class Test {
    public Test(Object[] obj) {}
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我的IDE不会在我执行以下操作时抱怨,而不提供super()

public abstract class Test {
    public Test(Object... obj) {}
}
Run Code Online (Sandbox Code Playgroud)

你说"只是运行程序,它会失败"之前,我用JUnit和程序运行正常,没有在扩展的类提供一个构造函数.我的问题是,为什么会发生这种情况?

子类看起来像这样:

public class Child extends Test {
    // Should throw error.
}
Run Code Online (Sandbox Code Playgroud)

java constructor abstract-class extends

3
推荐指数
1
解决办法
79
查看次数

无法将模板类传递给cout

当我尝试编译以下代码(在下面的小片段中将其截断)时,

#include <iostream>

using namespace std;

template <typename value_type>
class Tree {
public:
    Tree();
    ~Tree();
};

template <typename value_type>
const std::ostream& operator<<(const std::ostream& o, const Tree<value_type>& t) {
    return o;
}

int main() {
    Tree<int> tree;
    cout << tree << endl;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

在Mac

error: reference to overloaded function could not be resolved;
      did you mean to call it?
        cout << tree << endl;
                        ^~~~
Run Code Online (Sandbox Code Playgroud)

Debian Linux上的gnu gcc

error: no match for 'operator<<'
(operand types are
    'const ostream …
Run Code Online (Sandbox Code Playgroud)

c++ templates compiler-errors ostream c++98

3
推荐指数
1
解决办法
33
查看次数

正则表达式 - 包含多个下划线的单词

我正在制作一个Lexer,并选择使用正则表达式来分割我的代币.

我正在研究所有不同的令牌,除了真正让我烦恼的是单词和标识符.

你看,我现有的规则如下:

  • 单词不能以下划线开头或结尾.
  • 单词的长度可以是一个或多个字符.
  • 下划线只能字母之间使用,并且可以多次出现.

我想要的例子:

_foo         <- Invalid.
foo_         <- Invalid.
_foo_        <- Invalid.
foo_foo      <- Valid.
foo_foo_foo  <- Valid.
foo_foo_     <- Partially Valid. Only "foo_foo" should be picked up.
_foo_foo     <- Partially Valid. Only "foo_foo" should be picked up.
Run Code Online (Sandbox Code Playgroud)

我正在接近,因为这是我现在拥有的:

([a-zA-Z]+_[a-zA-Z]+|[a-zA-Z]+)

除此之外,它仅检测下划线的第一次出现.我想要所有这些.

个人要求:

我宁愿将答案包含在一个组中,因为我已经围绕它们构建了我的tokeniser,除非我能够更好地改变我的设计,如果你能想到更好的处理方式.这是我目前使用的:

private void tokenise(String regex, String[] data) {
    Set<String> tokens = new LinkedHashSet<String>();
    Pattern pattern = Pattern.compile(regex);
    // First pass. Uses regular expressions to split data and catalog …
Run Code Online (Sandbox Code Playgroud)

java regex identifier lexer

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