Pergunta

Estou procurando implementar o Algoritmo de pátio de malha, mas preciso de ajuda para descobrir qual é a melhor maneira de dividir uma corda em seus tokens.

Se você perceber, o primeiro passo do algoritmo é "Leia um token". Isso não é exatamente uma coisa não trivial a se fazer. Os tokens podem consistir em números, operadores e parens.

Se você está fazendo algo como:

(5+1)

Um string.split () simples me dará uma matriz dos tokens {"(", "5", "+", "1", ")"}.

No entanto, fica mais complicado se você tiver números com vários dígitos, como:

((2048*124) + 42)

Agora uma string ingênua.split () não fará o truque. Os números de vários dígitos são um problema.

Eu sei que poderia escrever um Lexer, mas existe uma maneira de fazer isso sem escrever um Lexer completo?

Estou implementando isso no JavaScript e gostaria de evitar ter que descer o caminho Lexer, se possível. Vou usar o "*", "+", "-" e "/" Operadores, junto com números inteiros.

Foi útil?

Solução

Que tal expressões regulares? Você pode escrever facilmente o Regex para dividi -lo da maneira que deseja, e o método JS String.split também aceita Regex como o parâmetro.

Por exemplo ... (modifique para incluir todos os chars que você precisa etc.)

/([0-9]+|[*+-\/()])/

Outras dicas

Você pode usar uma correspondência global, conforme descrito em http://mikesamuel.blogspot.com/2009/05/effect-parsing-in-javascript.html

Basicamente, você cria um regex que descreve um token

/[0-9]+|false|true|\(|\)/g

e coloque o 'g' no final para que ele corresponda globalmente e então você chama o método de correspondência

var tokens = myRegex.match(inputString);

e recupere uma matriz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top