Existe uma maneira simples de tocar uma corda sem um Lexer completo?
-
22-09-2019 - |
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.
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.