gpt4 book ai didi

parsing - 如何在 Nimrod 中编译时解析字符串?

转载 作者:行者123 更新时间:2023-12-02 10:29:27 26 4
gpt4 key购买 nike

正在经历the second part of Nimrod's tutorial我已经到了解释宏的部分了。文档说它们在编译时运行,所以我想我可以对字符串进行一些解析来创建自己的领域特定语言。但是,没有如何执行此操作的示例,debug macro example不显示如何处理字符串参数。

我想转换如下代码:

instantiate("""
height,f,132.4
weight,f,75.0
age,i,25
""")

…我会用手写成这样的东西:

var height: float = 132.4
var weight: float = 75.0
var age: int = 25

显然这个例子不是很有用,但我想看一些简单的东西(多行/逗号分割,然后转换),这可以帮助我实现更复杂的东西。

我的问题是宏如何获取输入字符串,解析它(在编译时!),以及在编译时可以运行什么样的代码(它只是语言的子集吗?我可以使用宏/来自其他导入模块的代码)?

编辑:根据答案,这里是问题的可能代码解决方案:

import macros, strutils

# Helper proc, macro inline lambdas don't seem to compile.
proc cleaner(x: var string) = x = x.strip()

macro declare(s: string): stmt =
# First split all the input into separate lines.
var
rawLines = split(s.strVal, {char(0x0A), char(0x0D)})
buf = ""

for rawLine in rawLines:
# Split the input line into three columns, stripped, and parse.
var chunks = split(rawLine, ',')
map(chunks, cleaner)

if chunks.len != 3:
error("Declare macro syntax is 3 comma separated values:\n" &
"Got: '" & rawLine & "'")

# Add the statement, preppending a block if the buffer is empty.
if buf.len < 1: buf = "var\n"
buf &= " " & chunks[0] & ": "

# Parse the input type, which is an abbreviation.
case chunks[1]
of "i": buf &= "int = "
of "f": buf &= "float = "
else: error("Unexpected type '" & chunks[1] & "'")
buf &= chunks[2] & "\n"

# Finally, check if we did add any variable!
if buf.len > 0:
result = parseStmt(buf)
else:
error("Didn't find any input values!")

declare("""
x, i, 314
y, f, 3.14
""")
echo x
echo y

最佳答案

总的来说,宏可以利用同一位置的过程也可以看到的所有纯 Nimrod 代码。例如,您可以导入 strutilspeg 来解析您的字符串,然后从中构造输出。示例:

import macros, strutils

macro declare(s: string): stmt =
var parts = split(s.strVal, {' ', ','})
if len(parts) != 3:
error("declare macro requires three parts")
result = parseStmt("var $1: $2 = $3" % parts)

declare("x, int, 314")
echo x

“调用”宏基本上会在编译时对其进行评估,就好像它是一个过程一样(需要注意的是,宏参数实际上是 AST,因此需要使用上面的 s.strVal )而不是 s),然后在宏调用的位置插入它返回的 AST。

宏代码由编译器的内部虚拟机评估。

关于parsing - 如何在 Nimrod 中编译时解析字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19955348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com