mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
compiler: update to get vweb working
This commit is contained in:
committed by
Alexander Medvednikov
parent
475807566d
commit
7158a012c3
@@ -89,6 +89,16 @@ const (
|
||||
}
|
||||
)
|
||||
|
||||
struct ParserState {
|
||||
scanner_text string
|
||||
tokens []Token
|
||||
token_idx int
|
||||
tok TokenKind
|
||||
prev_tok TokenKind
|
||||
prev_tok2 TokenKind
|
||||
lit string
|
||||
}
|
||||
|
||||
// new parser from string. unique id specified in `id`.
|
||||
// tip: use a hashing function to auto generate `id` from `text` eg. sha1.hexhash(text)
|
||||
fn (v mut V) new_parser_from_string(text string) Parser {
|
||||
@@ -265,6 +275,34 @@ fn (p &Parser) log(s string) {
|
||||
*/
|
||||
}
|
||||
|
||||
pub fn (p mut Parser) save_state() ParserState {
|
||||
return ParserState{
|
||||
scanner_text : p.scanner.text
|
||||
tokens : p.tokens
|
||||
token_idx : p.token_idx
|
||||
tok : p.tok
|
||||
prev_tok : p.prev_tok
|
||||
prev_tok2 : p.prev_tok2
|
||||
lit : p.lit
|
||||
}
|
||||
}
|
||||
|
||||
pub fn (p mut Parser) restore_state(state ParserState) {
|
||||
p.scanner.text = state.scanner_text
|
||||
p.tokens = state.tokens
|
||||
p.token_idx = state.token_idx
|
||||
p.tok = state.tok
|
||||
p.prev_tok = state.prev_tok
|
||||
p.prev_tok2 = state.prev_tok2
|
||||
p.lit = state.lit
|
||||
}
|
||||
|
||||
fn (p mut Parser) clear_state() {
|
||||
p.tokens = []
|
||||
p.token_idx = 0
|
||||
p.scanner.text = ''
|
||||
}
|
||||
|
||||
pub fn (p mut Parser) add_text(text string) {
|
||||
if p.tokens.len > 1 && p.tokens[p.tokens.len-1].tok == .eof {
|
||||
p.tokens.delete(p.tokens.len-1)
|
||||
@@ -273,6 +311,18 @@ pub fn (p mut Parser) add_text(text string) {
|
||||
p.scan_tokens()
|
||||
}
|
||||
|
||||
fn (p mut Parser) statements_from_text(text string, rcbr bool) {
|
||||
saved_state := p.save_state()
|
||||
p.clear_state()
|
||||
p.add_text(text)
|
||||
if rcbr {
|
||||
p.statements()
|
||||
} else {
|
||||
p.statements_no_rcbr()
|
||||
}
|
||||
p.restore_state(saved_state)
|
||||
}
|
||||
|
||||
fn (p mut Parser) parse(pass Pass) {
|
||||
p.cgen.line = 0
|
||||
p.cgen.file = cescaped_path(os.realpath(p.file_path))
|
||||
|
||||
Reference in New Issue
Block a user