gpt4 book ai didi

c - 解析参数后缀乘数和单位,SCPI

转载 作者:行者123 更新时间:2023-11-30 15:55:56 24 4
gpt4 key购买 nike

我正在解析 SCPI 字符串,它看起来像:

HEADER:HEADER:HEADER:CMD 数字乘数单位;

标记 NUMBER、MULTIPLIER 和 UNIT 之间不一定存在空格,也不一定存在固定长度的标记。我已经能够解析(从 L 到 R)直到 NUMBER 的末尾。但是,MULTIPLIER 和 UNIT 标记都是可选的,并且可以具有相同的字符。

例如后缀可以是“P”(其中 P 可以表示 pico [mult] 或 poise [unit])

或“MA”(可以是兆安[multi]或毫安[multi-unit])

是否有人有解析此类语法的经验,或者实际上其他人是否对如何将这些语法解析为正确的标记有任何想法。

编辑:对于学究来说,我想这更多是词法分析而不是解析。

最佳答案

也许在您的简单示例中,使用几个嵌套的 if 比尝试更强大的方法更容易,但是如果您不想手动执行此操作或者如果实际情况问题有点大,您可以尝试将您的输入与正则表达式(标准词法分析器的东西)进行匹配。

在 POSIX 系统上,您可以使用 regexec .

编辑:如何使用 if (和 select)执行此操作:

我假设您的输入是在 text 中,并且您已经读到了 NUMBER 的末尾,因此您的索引 i 显示了这一点!

// helper function: find next non-whitespace character
char get_prev(char *text, int *end, int i)
{
for (; *end > i; --*end)
if (text[*end] != ' ' && text[*end] != '\t'
&& text[*end] != '\n' && text[*end] != '\r')
// or `if (text[*end] > ' ')` if ASCII
break;
return text[(*end)--];
}

... your function...
// read up to i
int end = strlen(text);
int power_of_10 = 0; // for MULT
enum unit unit = UNKNOWN; // for UNIT
switch (get_prev(text, &end, i))
{
case 'P':
unit = POISE;
break;
case 'A':
unit = AMP;
break;
...
default: // unforeseen character
case '\0':
// neither UNIT nor MULT exist
break;
}
if (unit != UNKNOWN)
switch (get_prev(text, &end, i))
{
case 'M':
power_of_ten = -3; // milli
break;
case 'A':
switch (get_prev(text, &end, i))
{
case 'M':
power_of_ten = 6; // mega
break;
...
}
break;
...
default: // unforeseen character
case '\0':
// MULT doesn't exist
break;
}

请注意,在这种情况下,我假设 UNIT 是强制性的。如果 MULT 和 UNIT 都是可选的,我不确定如何区分 10MA 中的兆安和毫安。不过,您可以向第一个 switch 添加更多案例,这些案例对应于 MULT 的值,并将其中的 power_of_10 更改为。例如,如果在第一个 switch 中看到 k,则可以理解 UNIT 不存在,并且 power_of_10 > 是 3。

关于c - 解析参数后缀乘数和单位,SCPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615982/

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