gpt4 book ai didi

perl - 脚本 : Read condition written in words and converting into C - ternary operator

转载 作者:行者123 更新时间:2023-12-02 07:03:01 26 4
gpt4 key购买 nike

我是 perl 脚本的新手。我正在编写脚本来读取 excel 文件并以 C 编程语法放入文本文件。

所以我的 excel 表中有如下字符串:

If ((Myvalue.xyz == 1) Or (Frmae_1.signal_1 == 1)) Then a = 1
else a = 0;

我必须将其转换为:

a = (((Myvalue.xyz == 1) || (Frmae_1.signal_1 == 1))?1:0)

这在 perl 中如何处理?

最佳答案

我不认为在代码字符串中使用正则表达式是一个特别好的主意。您输入的语法看起来不太特别,所以我们可以使用 Marpa 解析它,使用如下语法

:default    ::= action => [values]
:start ::= StatementList
:discard ~ ws

StatementList ::= <Expression>+ separator => <op semicolon> bless => Block

Expression ::=
('(') Expression (')') assoc => group action => ::first
| Number bless => Number
|| Ident bless => Var
|| Expression ('==') Expression bless => Numeric_eq
|| Expression ('=' ) Expression bless => Assign
|| Expression ('Or') Expression bless => Logical_or
|| Conditional

Conditional ::=
('If') Expression ('Then') Expression
bless => Cond
| ('If') Expression ('Then') Expression ('Else') Expression
bless => Cond

Ident ~ ident
Number ~ <number int> | <number rat>

word ~ [\w]+
ident ~ word | ident '.' word
<number int> ~ [\d]+
<number rat> ~ <number int> '.' <number int>
ws ~ [\s]+
<op semicolon> ~ ';'

然后:

use Marpa::R2;
my $grammar = Marpa::R2::Scanless::G->new({
bless_package => 'Ast',
source => \$the_grammar,
});
my $recce = Marpa::R2::Scanless::R->new({ grammar => $grammar });
$recce->read(\$the_string);
my $val = $recce->value // die "No parse found";
my $ast = $$val;

一旦我们有了 AST,将它编译成类似 C 的表示就不会太复杂。可以通过一些思考来分解出具有“优化”过程的常见分配。

然而,展示如何做到这一点相当冗长,所以我将所有深入的内容都放在这个 blogpost 中。 .然后我们可以定义一个递归遍历树并发出类 C 代码的方法,例如

package Ast::Var;
...;
sub compile { my $self = shift; $self->name } # no modification needed

package Ast::Logical_Or;
...;
sub compile {
my $self = shift;
# C's "||" operator, plus parens to specify precedence
"(" . $self->l->compile . "||" . $self->r->compile . ")";
}

package Ast::Cond;
...;
sub compile {
my $self = shift;
return sprintf '(%s ? %s : %s)',
$self->cond->compile,
$self->then->compile,
$self->else->compile;
}

等对于所有其他 AST 节点类型。

关于perl - 脚本 : Read condition written in words and converting into C - ternary operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275748/

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