Сценарийлер: Оқу шарттарын оқып, С - үшінші операторға айналдырыңыз

Мен 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-де өңделеді?

1
Әрине, екі сан болып табылатын үш жақты өрнек берілгенде, ол 1 немесе 0 болады.
қосылды автор Hunter McMillen, көзі
Әрине, екі сан болып табылатын үш жақты өрнек берілгенде, ол 1 немесе 0 болады.
қосылды автор Hunter McMillen, көзі
@mpapec Boolean өрнегінің нәтижесі қазірдің өзінде бір сан болады.
қосылды автор Hunter McMillen, көзі
@mpapec Boolean өрнегінің нәтижесі қазірдің өзінде бір сан болады.
қосылды автор Hunter McMillen, көзі
@mpapec Неліктен 1-ге көбейсің?
қосылды автор Hunter McMillen, көзі
@mpapec Неліктен 1-ге көбейсің?
қосылды автор Hunter McMillen, көзі
Мен түсінемін, бұл жұмыс істеу керек. Бұл жерде tutorialspoint.com/perl/perl_conditions.htm туралы ақпарат бар веб-сайт бар.
қосылды автор Joe W, көзі
Міне, көмектесе алатын сұрақпен асып кету туралы басқа мәселе. stackoverflow.com/questions/9009/…
қосылды автор Joe W, көзі
Міне, көмектесе алатын сұрақпен асып кету туралы басқа мәселе. stackoverflow.com/questions/9009/…
қосылды автор Joe W, көзі
Мен түсінемін, бұл жұмыс істеу керек. Бұл жерде tutorialspoint.com/perl/perl_conditions.htm туралы ақпарат бар веб-сайт бар.
қосылды автор Joe W, көзі
my $ a = 1 * ($ val1 == 1 || $ val2 == 1); деген не?
қосылды автор Сухой27, көзі
@HunterMcMillen OP 0 | 1 санының нәтижесі ретінде келеді
қосылды автор Сухой27, көзі
@HunterMcMillen OP 0 | 1 санының нәтижесі ретінде келеді
қосылды автор Сухой27, көзі
my $ a = 1 * ($ val1 == 1 || $ val2 == 1); деген не?
қосылды автор Сухой27, көзі
@HunterMcMillen бұл 1 немесе логикалық үшін бос жол болады
қосылды автор Сухой27, көзі
@HunterMcMillen бұл 1 немесе логикалық үшін бос жол болады
қосылды автор Сухой27, көзі
иә, бірақ мен үшжақты пайдаланбаймын және сіз неге * 1 пайдаланатынымды сұрадыңыз
қосылды автор Сухой27, көзі
иә, бірақ мен үшжақты пайдаланбаймын және сіз неге * 1 пайдаланатынымды сұрадыңыз
қосылды автор Сухой27, көзі
Сіз сұрағаныңыз - бір тілді басқа мақсатты тілге жинау. Бұл шын мәнінде өте қызықты, бірақ қарапайым регерсті пайдаланудан гөрі күрделірек (ол көптеген жағдайларда жұмыс істейді, бірақ бұл тапсырма үшін дұрыс емес деп ойлайды). Сондықтан, мен бірнеше сағат ішінде жауап жазамын. Ол мыналарды қамтиды: Marpa :: R2 , AST манипуляциясы, оңтайландыру өтуі, құрастыру және Perl OO. Ол талдаушы теориясын және т.б. жабуға болмайды немесе көшірме және паста дайын шешімін қамтамасыз етпейді. Көлемі: ~ 0.2kloc
қосылды автор amon, көзі
Сіз сұрағаныңыз - бір тілді басқа мақсатты тілге жинау. Бұл шын мәнінде өте қызықты, бірақ қарапайым регерсті пайдаланудан гөрі күрделірек (ол көптеген жағдайларда жұмыс істейді, бірақ бұл тапсырма үшін дұрыс емес деп ойлайды). Сондықтан, мен бірнеше сағат ішінде жауап жазамын. Ол мыналарды қамтиды: Marpa :: R2 , AST манипуляциясы, оңтайландыру өтуі, құрастыру және Perl OO. Ол талдаушы теориясын және т.б. жабуға болмайды немесе көшірме және паста дайын шешімін қамтамасыз етпейді. Көлемі: ~ 0.2kloc
қосылды автор amon, көзі

6 жауаптар

Кодекс жүйесінде регрессияны лақтырып тастау әсіресе жақсы идея болар еді деп ойлаймын. Сіздің енгізуіңіздің синтаксисі тым керемет көрінбейді, сондықтан оны Marpa-мен ұқсас грамматиканы қолданып,

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

StatementList ::= + separator =>  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  ~  | 

word    ~ [\w]+
ident   ~ word | ident '.' word
 ~ [\d]+
 ~  '.' 
ws      ~ [\s]+
 ~ ';'

Сонда:

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-ға ұқсас түрде жасау өте күрделі емес. «Оңтайландыру» пастамасымен жалпы тағайындалуды факторинг жүргізу біраз ойлауға болады.

Дегенмен, бұл қалай жасауға болатынын көрсету өте ұзын, сондықтан мен барлық терең мәліметтерді осы блог блогы . Бұдан кейін ағаш арқылы қайталанатын және С-тәрізді кодты шығаратын әдісті анықтай аламыз, мысалы:

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 түйіндерінің түрлері үшін.

7
қосылды

Кодекс жүйесінде регрессияны лақтырып тастау әсіресе жақсы идея болар еді деп ойлаймын. Сіздің енгізуіңіздің синтаксисі тым керемет көрінбейді, сондықтан оны Marpa-мен ұқсас грамматиканы қолданып,

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

StatementList ::= + separator =>  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  ~  | 

word    ~ [\w]+
ident   ~ word | ident '.' word
 ~ [\d]+
 ~  '.' 
ws      ~ [\s]+
 ~ ';'

Сонда:

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-ға ұқсас түрде жасау өте күрделі емес. «Оңтайландыру» пастамасымен жалпы тағайындалуды факторинг жүргізу біраз ойлауға болады.

Дегенмен, бұл қалай жасауға болатынын көрсету өте ұзын, сондықтан мен барлық терең мәліметтерді осы блог блогы . Бұдан кейін ағаш арқылы қайталанатын және С-тәрізді кодты шығаратын әдісті анықтай аламыз, мысалы:

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 түйіндерінің түрлері үшін.

7
қосылды

The same expression is valid in Perl (modulo the access operator, that -> in perl and not the dot. You can also do

a = $my_value->xyz == 1 || $frmae_1->signal_1 == 1 ? 1 : 0;

the ? 1 : 0 part is not even necessary since $my_value->xyz == 1 || $frmae_1->signal_1 == 1 will return the Perl true or false values (numerically 1 and 0, string '1' and '')...

0
қосылды

The same expression is valid in Perl (modulo the access operator, that -> in perl and not the dot. You can also do

a = $my_value->xyz == 1 || $frmae_1->signal_1 == 1 ? 1 : 0;

the ? 1 : 0 part is not even necessary since $my_value->xyz == 1 || $frmae_1->signal_1 == 1 will return the Perl true or false values (numerically 1 and 0, string '1' and '')...

0
қосылды

Айталық, сіздің жолыңыз $ str түрінде сақталады. Бұдан басқа материалдарды алу үшін келесі әрекеттерді орындауға болады:

my ($cond, $set, $then, $else) = ($str =~ /^If (.*) Then (.*?=\s+)(.*) else \2(.*);$/);

Енді сізде $ cond , $ set ішіндегі a = жағдайыңыз бар және бұл айнымалы мәнде $ < код> және $ else .

Өз жағдайыңызда «немесе», «және» дегенді ауыстырыңыз

$cond =~ s/\sOr\s/ || /g;
$cond =~ s/\sAnd\s/ && /g;

қалаған нәтижені басып шығарыңыз

print "$set($cond ? $then : $else);

Бұл қалыпты өрнектер жолыңызбен жұмыс істейді: мен алдым

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

бірақ егер сіздің нақты жолдарыңызда «Сонда» деп жазылған болса, сәтсіздікке ұшырауы мүмкін, егер кейбір жолдағы «Myvalue.xyz» «Myvalue.And» немесе сол сияқты нәрсе болса, жарылып кетеді. = немесе Немесе айналасында бос орындар болмаса, бұл да жұмыс істемейді. Бірақ код барлық осы кірістермен жұмыс істеу үшін оңай өзгертілуі мүмкін. Әдеттегі сөйлемдерден абай болыңыз, олар күшті.

0
қосылды

Айталық, сіздің жолыңыз $ str түрінде сақталады. Бұдан басқа материалдарды алу үшін келесі әрекеттерді орындауға болады:

my ($cond, $set, $then, $else) = ($str =~ /^If (.*) Then (.*?=\s+)(.*) else \2(.*);$/);

Енді сізде $ cond , $ set ішіндегі a = жағдайыңыз бар және бұл айнымалы мәнде $ < код> және $ else .

Өз жағдайыңызда «немесе», «және» дегенді ауыстырыңыз

$cond =~ s/\sOr\s/ || /g;
$cond =~ s/\sAnd\s/ && /g;

қалаған нәтижені басып шығарыңыз

print "$set($cond ? $then : $else);

Бұл қалыпты өрнектер жолыңызбен жұмыс істейді: мен алдым

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

бірақ егер сіздің нақты жолдарыңызда «Сонда» деп жазылған болса, сәтсіздікке ұшырауы мүмкін, егер кейбір жолдағы «Myvalue.xyz» «Myvalue.And» немесе сол сияқты нәрсе болса, жарылып кетеді. = немесе Немесе айналасында бос орындар болмаса, бұл да жұмыс істемейді. Бірақ код барлық осы кірістермен жұмыс істеу үшін оңай өзгертілуі мүмкін. Әдеттегі сөйлемдерден абай болыңыз, олар күшті.

0
қосылды