我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:
WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)
并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢
为什么在Rust中强制使用不变性,除非你指定mut?这是安全性的设计选择吗,您是否认为它在其他语言中应该如何自然?
我应该澄清一下,我还是Rust的新手.那么这是一种与该语言中的另一个功能相关的设计选择吗?
好的,所以我是一个通常会编写 Java/C++ 的人,而且我刚刚开始编写 C。我目前正在编写一个词法分析器,我无法忍受字符串在 C 中的工作方式,因为我可以'不执行字符串算术。所以这是我的问题:
char* buffer = "";
char* line = "hello, world";
int i;
for (i = 0; i < strlen(line); i++) {
buffer += line[i];
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 C 中做到这一点?由于上面的代码不是有效的 C,我该怎么做呢?基本上我在循环一个 string line,并且我试图将每个字符附加到bufferstring 。
所以我要说我有以下语法:
let_stat = "let" iden [ "=" expr ];
if_stat = "if" expr "->" stat;
stat = let_stat | if_stat;
Run Code Online (Sandbox Code Playgroud)
这将是以下psuedo-ish代码:
let_stat parseLetStat() {
if token is "let" {
consume token
if token is identifier {
char *value = consumetoken.value
let_stat let = new let_stat;
let.name = value;
if token is "=" {
let.value = parseExpression;
}
return let
}
}
}
if_stat parseIfStat() {
if token is "if" {
consume token
expression expr = parseExpression;
block block = parseBlock; …Run Code Online (Sandbox Code Playgroud) 我正在尝试解析一个简单的脚本语言的表达式,但我很困惑.现在,只能将数字和字符串文字解析为表达式:
int x = 5;
double y = 3.4;
str t = "this is a string";
Run Code Online (Sandbox Code Playgroud)
但是,我对解析更复杂的表达式很困惑:
int a = 5 + 9;
int x = (5 + a) - (a ^ 2);
Run Code Online (Sandbox Code Playgroud)
我想我会像下面这样实现它:
do {
// no clue what I would do here?
if (current token is a semi colon) break;
}
while (true);
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒,我不知道从哪里开始.谢谢.
编辑:我的解析器是递归下降解析器
我的表达"类"如下:
typedef struct s_Expression {
char type;
Token *value;
struct s_Expression *leftHand;
char operand;
struct s_Expression *rightHand;
} ExpressionNode;
Run Code Online (Sandbox Code Playgroud)
有人提到递归下降解析器能够解析表达式而不做中缀,而不是后缀.最好,我想要一个像这样的表达式:
例如:
int x …Run Code Online (Sandbox Code Playgroud) 是否有任何预处理器指令或其他方法来检查正在运行的机器是 32 位还是 64 位 C?我试过用谷歌搜索这个,但 C 的问题是它会带来 C#、C++ 等的结果。另外,我更希望它能在 Windows、Linux 和 Mac 上运行。
我应该提一下,我在C中生成代码,而不是手动执行此操作.我之所以这样说是因为它背后有很多代码并不重要,因为编译器应该管理它.无论如何,我将如何在C中模拟lambda?我以为我可以在源代码中的某处生成一个带有随机名称的函数然后调用它?我不太确定.我还没有真正尝试过任何东西,因为我想在实现它之前把想法弄清楚.
是否有某种预处理器指令可以做,或者某些宏可以使这个更清洁?我受到了Jon Blow的启发,尝试编译器开发,他似乎用他的语言Jai实现了Lambdas.但是,我认为他做了一些事情,他生成字节码,然后进入C?我不确定.
编辑:我正在编写一个编译器,编译器只是我的一个项目让我忙碌,而且我想了解更多有关编译器的知识.我主要使用clang,我使用的是Ubuntu 14.10.我没有任何垃圾收集,但我想尝试使用某种智能指针-y/rust/ARC启发的内存模型来进行垃圾收集,即几乎没有开销.我选择C是因为我想更多地涉足它.我的项目是免费软件,只是一个爱好项目.
无论如何,在C函数参数中奇怪的标题如下:
void func_name(int a, int b) {
}
Run Code Online (Sandbox Code Playgroud)
然而在Rust:
fn func_name(a: int, b: int) {
}
Run Code Online (Sandbox Code Playgroud)
这只是语法上的偏好,并且对Rust的创建者有吸引力,还是出于我不了解的特定目的?例如,Go有"可选的分号",但它们实际上是在表达式结束时显示的.请记住,我是Rust的一个完整的新手,所以如果你试图在Rust中提供一些奇特的例子,我可能不会理解:(
在我提出问题之前,我有点像Linux新手.无论如何,我正在尝试在Ubuntu上创建我的项目,我刚刚从LLVM 3.4升级到LLVM 3.5.当我尝试创建项目时,我收到以下链接器错误:
felix@felix-dev:~/Dev/jayfor$ make
clang `llvm-config --cflags` -Wall -Iincludes/ -g src/*.c -c src/*.c
clang++ *.o `llvm-config --libs --system-libs --cflags --ldflags core analysis executionengine jit interpreter native` -o j4
/usr/bin/ld: cannot find -ledit
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1
我搜索了我的问题,并询问IRC的一些朋友无济于事.当我运行edit在终端,它没有说像什么也找不到命令,我看到了,我应该apt-get的libedit2,我做到了,它仍然没有解决我的问题.
这是Makefile的链接.
我可以信任表单中字段的必需属性吗?
<input type="text" name="username" required/>
Run Code Online (Sandbox Code Playgroud)
上面的代码将确保它是一个必填字段,但用户不能只检查元素并删除属性?我是否有必要检查if (isset($_POST...或者我可以依赖所需的属性来做这件事吗?
假设你有一个只有 4 个寄存器 A、B、C 和 D 的虚拟机。编译器如何用有限的空间存储如此多的变量?
是否有多种方法可以做到这一点,或者是否有一种可靠的方法可以实现这一点?这个奇特的科学术语是什么?它被认为是一个复杂的问题吗?
compiler-construction register-allocation cpu-registers vm-implementation