假设我有一个简单的上下文无关文法:
Z = XY
X = ("ab")+
Y = "abc"
我对此语法的简化递归下降解析器如下所示:
// takes an input string and returns the length of match, -1 for failure
int Z(str) {
int len1 = X(str);
if (len1 >= 0) {
int len2 = Y(str.substr(length));
if (len2 >= 0) {
return len1 + len2;
我正在编写一个表达式和可视化的解析器,这意味着递归下降解析或构造的每一步都将像的微型版本一样可视化
// Expression grammer
Goal -> Expr
Expr -> Term + Term
| Expr - Term
| Term
Term -> Term * Factor
| Term / Factor
| Factor
Factor -> (Expr)
| num
| name
所以我想知道什么数据结构可以方便地存储构造AST的每一步,以及如何实现构造AST的每一步的可视化。
我有一个递归函数求和::Int -> Int,它返回所有自然数的和,从它的参数下降到零,例如,和3应该返回和3+2+1+0 = 6。
sumdown :: Int -> Int
sumdown 0 = 0
sumdown x = x + sumdown(x-1)
我也有一个我不完全理解的定义,能不能有人帮我评估一下,告诉我为什么它可能比上面的定义更有效率?
sumdown n = sumd n 0
sumd 0 a = a
sumd n a = sumd (n-1) (n+a)
谢谢。
在线程中调用递归函数是个好主意吗?我创建了10个线程,线程函数依次调用一个递归函数。最糟糕的是
ThreadFunc( )
{
for( ;condn ; )
recursiveFunc(objectId);
}
bool recursiveFunc(objectId)
{
//Get a instance to the database connection
// Query for attibutes of this objectId
if ( attibutes satisfy some condition)
re
我有语法:
S -> bU | ad | d
U -> Ufab | VSc | bS
V -> fad | f | Ua
要构造递归下降解析器,我需要LL(1)形式。我得到的最好是:
S -> bU | ad | d
U -> fY | bSX
Y -> adScX | ScX
X -> fabX | aScX | ε
删除了左递归,并做了一些左因式分解,但我被卡住了。试了几个小时,但我不明白.
例如,有效字符串是:
bbdfabadcbbdfabfabfabfabbfadadcfabfabbbadaadcbfbbdfabc
显然,我的语法形式对某些
我的任务是开发一个递归下降分析器为一个特定的语法。
我所分析的语言本质上只是将"“添加到一个论点的开头和结尾。例如,以下输入:
start 'Begin' { top { text {Top of the world} } }
将产出:
<start> Begin <top> Top of the world </top> </start>
到目前为止,我和解析者在一起的地方是:
public String parser(String s){
StreamTokenizer st = new StreamToken
我正在编写一个递归函数(用C语言编写),需要一种方法来知道递归是否已经完成。我想知道我是否可以在没有变量或标志的情况下做到这一点。以一个函数为例。
例如,如果递归下降了3级,然后又恢复了,有没有一种方法可以使用标志检查我是否处于1....withought级?
lev 1 -> lev 2 -> lev 3 -> lev 2 -> lev 1(检查此处)
我正在用OCaml编写一个简单的递归下降解析器。通常(据我所知,从在线教程和书籍中可以看出),异常用于指示解析失败,例如:
match tok with
TokPlus -> ...
| _ -> raise SyntaxError
但是,我正在考虑使用option类型,即:
match tok with
TokPlus -> Some(...)
| _ -> None
我想这样做的主要原因是,使用选项类型允许我优化我的一些组合子,使其成为尾递归的。
使用选项而不是异常有什么缺点吗?当我开始解析更复杂的结构时,这个决定会咬我的脚吗?
我有下一个规则:
factor ::= id | func | ( expr )
func ::= id ( list )
list ::= list , expr | expr
我编写了简单的下降解析器:
function factor() {
if (lookahead === "(") {
match("(");
expr();
return match(")");
} else {
id();
} // How to understand what it can be a func he
我正在写一个简单的递归下降解析器,它接受标准输入并计算'a‘和'b’字符的数量。其语法如下:
S -> A B '\n‘
A -> a A|空
B -> b B|空
int lookahead;
int nontermA();
int nontermB();
void match (int terminal){
if (lookahead == terminal){
lookahead = getchar();
} else {
printf("Syntax error at %c\n"