AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77590226
Accepted
librasteve
librasteve
Asked: 2023-12-02 19:50:44 +0800 CST2023-12-02 19:50:44 +0800 CST 2023-12-02 19:50:44 +0800 CST

É possível elevar um valor made para Grammar TOP?

  • 772

Eu tenho esta gramática raku:

#!/usr/bin/env raku
use v6.d;

use Grammar::Tracer;

grammar Grammar {
    token TOP {
          <city>      \v
          <state-zip> \v?
    }
    token city {
        ^^ \V* $$
    }
    token state-zip {
        ^^ <state> <.ws>? <zipcode> $$    #<.ws> is [\h* | \v]
    }
    token state {
        \w \w
    }
    token zipcode {
        \d ** 5
    }
}

class Actions {
    method TOP($/) {
        #works
        say "city is ",    $_ with $<city>.made;
        say "state is ",   $_ with $<state-zip><state>.made;
        say "zipcode is ", $_ with $<state-zip><zipcode>.made;

        #doesn't work
        say "state2 is ",   $_ with $<state>.made;
        say "zipcode2 is ", $_ with $<zipcode>.made;
    }

    method city($/)     { make ~$/ }
    method state($/)    { make ~$/ }
    method zipcode($/)  { make ~$/ }
}

my $address = q:to/END/;
Springfield,
IL 62704
END

Grammar.parse($address, :actions(Actions));

Funciona muito bem:

TOP
|  city
|  * MATCH "Springfield,"
|  state-zip
|  |  state
|  |  * MATCH "IL"
|  |  zipcode
|  |  * MATCH "62704"
|  * MATCH "IL 62704"
city is Springfield,
state is IL
zipcode is 62704
* MATCH "Springfield,\nIL 62704\n"

token <state-zip>existe para permitir que o estado e o zip residam em uma única linha ou para abranger várias linhas. Lembre-se que se trata de um MRE, por isso procuro respostas que não alterem a Gramática, mas sim os aspectos make/made das Ações.

MAS - para agilizar meu código, gostaria de poder acessar o estado e o CEP no nível superior da method TOP($/) {}ação de acordo com meus exemplos state2 e zipcode2. Tenho tentado "levantar" os valores de estado criados e tokenizar a árvore de correspondência - por exemplo, talvez algo como:

# doesn't work
method TOP($/) {
    make $<state>.made;
    make $<zip>.made;
    ...
}
method state-zip($/) {
    make $<state>.made;
    make $<zip>.made;
}

Isso é possível?

parsing
  • 2 2 respostas
  • 62 Views

2 respostas

  • Voted
  1. raiph
    2023-12-02T21:20:50+08:002023-12-02T21:20:50+08:00

    TL;DR Você não pode modificar as Matchcapturas de um objeto. Há três coisas que posso pensar que você pode fazer: Ⓐ Modificar o .madeatributo do objeto de correspondência e/ou Ⓑ Modificar $/para usar seus atalhos e/ou Ⓒ Limpar?

    Você não pode modificar as Matchcapturas de um objeto

    O que você está perguntando é uma coisa natural de se querer fazer. Lembro-me de querer isso sozinho.

    Na minha resposta a Como faço para alterar as capturas em uma gramática? ), sugeri que você não pode alterar as Matchcapturas de um objeto. E isso é verdade atualmente em Raku(do). Mas agora me pergunto se algo poderia ser feito. Voltarei a isso na última seção desta resposta.

    .madeModifique o atributo do objeto de correspondência

    O que sugiro por enquanto é que você use o .madeatributo do objeto match method TOPcomo segue.

    Mantenha seu código original:

            #works
            say "city is ",    $_ with $<city>.made;
            say "state is ",   $_ with $<state-zip><state>.made;
            say "zipcode is ", $_ with $<state-zip><zipcode>.made;
    

    Insira o código para criar o dicionário e depois make:

            my %hash;        
            %hash<state> = $_ with $<state-zip><state>.made;
            %hash<zipcode> = $_ with $<state-zip><zipcode>.made;
            make %hash if %hash;
    

    Mantenha seu código original, mas extraia dos objetos de correspondência .made:

            #works
            say "state2 is ",   $_ with $/.made<state>;
            say "zipcode2 is ", $_ with $/.made<zipcode>;
    

    Modifique $/para usar seus atalhos

    Nota. Esta seção é sobre como modificar (atribuir/vincular) o símbolo (variável) $/para que ele se refira a um objeto/valor diferente. Não se trata de modificar um objeto/valor que foi atribuído ou vinculado a $/.

    A seguir está uma combinação do código da primeira seção acima com alguns ajustes. Dessa forma, seu código ainda poderá usar os $/atalhos usuais de.¹

    Adicione uma is copycaracterística para que o $/parâmetro possa ser reatribuído:

        method TOP($/ is copy) {
            ...
    

    Mantenha o resto do código igual até a makelinha:

            ...
            make %hash if %hash;
    

    Insira uma reatribuição (ou ligação) à $/sua .madecarga útil:

            $/ .= made;
    

    Agora seu código pode voltar aos atalhos habituais:

            say "state2 is ",   $_ with $<state>;
    

    Nota. Ao reatribuir/vincular, $/você substitui a ligação original pelo objeto de correspondência original. Então isso para de funcionar:

            say "city is ",    $_ with $<city>;
    

    Na última seção desta resposta, esboço possíveis soluções para esse problema.

    Limpe?

    Talvez Matchos objetos possam ser fornecidos com novos métodos que permitam aos usuários adicionar aliases às capturas existentes em objetos correspondentes a outros objetos correspondentes, desde que tenham sido construídos com base na mesma string de entrada?

    Uma ideia mais hackeada é criar uma nova classe que seja como um mutável vazio Hash(portanto, pode ter chaves adicionadas a ele), mas que seja inicializada com um Matchobjeto existente que esteja vinculado a um atributo de delegação ( has Match $original handles **;). O último lidaria com quaisquer pesquisas que não correspondessem a uma chave no hash, fazendo failover para fazer a pesquisa no Matchobjeto existente. (Não tenho certeza se essa é a handlesexpressão correta, mas quero postar esta atualização para poder dormir.)

    Notas de rodapé

    ¹ Qualquer dado pode ser atribuído ou vinculado a $/, não apenas Matcha objetos. É sempre o caso que $0tem o alias de $/[0], $1to $/[1]e $<foo>to $/<foo>e $<bar>to $/<bar>e assim por diante, não importa o que tenha sido atribuído ou vinculado a $/. Na verdade, por muitos anos tenho usado $/o que chamo de "a variável de dados", abreviação de variável "(des)estrutura de dados", de modo que "objeto de correspondência atual" é apenas um dos "variáveis ​​de dados "são muitos usos.

    • 4
  2. Best Answer
    Himanshu Sharma
    2023-12-02T21:28:40+08:002023-12-02T21:28:40+08:00

    Seu código original:

        #works
        say "city is ",    $_ with $<city>.made;
        say "state is ",   $_ with $<state-zip><state>.made;
        say "zipcode is ", $_ with $<state-zip><zipcode>.made;
    

    Código adicional para criar dicionário e depois make:

        my %hash;        
        %hash<state> = $_ with $<state-zip><state>.made;
        %hash<zipcode> = $_ with $<state-zip><zipcode>.made;
        make %hash if %hash;
    

    Seu código original, mas baseado em objetos de correspondência .made:

        #works
        say "state2 is ",   $_ with $/.made<state>;
        say "zipcode2 is ", $_ with $/.made<zipcode>;
    
    • 1

relate perguntas

  • como usar XPath/CSS para pegar o valor/conteúdo de um atributo cujo nome começa com dois pontos?

  • Gramática ANTLR para reconhecimento de números e identificadores de notação exponencial

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve