说明
阅读文章,代码都是Python级别的。特意转化了一下,顺便实践一遍思路。很有意思,仿佛回到了大学。
代码
/**
* SPI - Simple Pascal Interpreter
*
*/
// ------------------------------------------------------------
// LEXER
// ------------------------------------------------------------
// Token types
//
// EOF (end-of-file) token is used to indicate that
// there is no more input left for lexical analysis
const [INTEGER, PLUS, MINUS, MUL, DIV, LPAREN, RPAREN, EOF] = [
'INTEGER', 'PLUS', 'MINUS', 'MUL', 'DIV', '(', ')', 'EOF',
]
class Token {
constructor(type, value) {
this.type = type
this.value = value
}
}
class Lexer {
constructor(text) {
this.text = text
this.pos = 0
this.currentChar = this.text[this.pos]
}
error() {
throw new Error('Invalid Charactor')
}
advance() {
this.pos += 1
if (this.pos > this.text.length - 1) this.currentChar = null
else this.currentChar = this.text[this.pos]
}
skipWhitespace() {
while (this.currentChar === ' ') this.advance()
}
/**
* Return a (multidigit) integer consumed from the input.
*/
integer() {
let result = ''
while (/[0-9]/.test(this.currentChar)) {
result += this.currentChar
this.advance()
}
return parseInt(result)
}
/**
* Lexical analyzer (also known as scanner or tokenizer)
*
* This method is responsible for breaking a sentence
* apart into tok