如何解析子节点?
How do I parse children nodes?
假设我有以下语法:
let_stat = "let" iden [ "=" expr ];
if_stat = "if" expr "->" stat;
stat = let_stat | if_stat;
这将是以下伪代码:
let_stat parseLetStat() {
if token is "let" {
consume token
if token is identifier {
char *value = consumetoken.value
let_stat let = new let_stat;
let.name = value;
if token is "=" {
let.value = parseExpression;
}
return let
}
}
}
if_stat parseIfStat() {
if token is "if" {
consume token
expression expr = parseExpression;
block block = parseBlock;
if_stat ifstmt = new if_stat
ifstmt.expr = expr
ifstmt.block = block
return ifstmt
}
}
stat parseStatement() {
}
parseStatement
函数有什么作用?它如何选择调用哪个函数,if_stat 函数还是 let_stat 函数?或者我会把所有代码都放到一个函数中吗?我不太明白,因为我很困惑,所以任何帮助都会很好。
您的特定问题的关键问题是,当 EBNF 规则中存在交替时,非终结符的解析器必须调用 所有 备选方案并询问每个备选方案是否识别构造;每个子解析器都必须 return 一个表示是或否的标志。
您可能需要的是 general principles for writing a recursive descent parser.
假设我有以下语法:
let_stat = "let" iden [ "=" expr ];
if_stat = "if" expr "->" stat;
stat = let_stat | if_stat;
这将是以下伪代码:
let_stat parseLetStat() {
if token is "let" {
consume token
if token is identifier {
char *value = consumetoken.value
let_stat let = new let_stat;
let.name = value;
if token is "=" {
let.value = parseExpression;
}
return let
}
}
}
if_stat parseIfStat() {
if token is "if" {
consume token
expression expr = parseExpression;
block block = parseBlock;
if_stat ifstmt = new if_stat
ifstmt.expr = expr
ifstmt.block = block
return ifstmt
}
}
stat parseStatement() {
}
parseStatement
函数有什么作用?它如何选择调用哪个函数,if_stat 函数还是 let_stat 函数?或者我会把所有代码都放到一个函数中吗?我不太明白,因为我很困惑,所以任何帮助都会很好。
您的特定问题的关键问题是,当 EBNF 规则中存在交替时,非终结符的解析器必须调用 所有 备选方案并询问每个备选方案是否识别构造;每个子解析器都必须 return 一个表示是或否的标志。
您可能需要的是 general principles for writing a recursive descent parser.