我期待写一些递归下降解析器的伪代码.现在,我没有这种编码的经验.我在线阅读了一些例子,但它们只适用于使用数学表达式的语法.这是我基于解析器的语法.
S -> if E then S | if E then S else S | begin S L | print E
L -> end | ; S L
E -> i
Run Code Online (Sandbox Code Playgroud)
我必须编写方法S(),L()并E()返回一些错误消息,但我在网上找到的教程没有帮助很多.任何人都可以指出我正确的方向并给我一些例子吗?
我想用C#或Java语法编写它,因为我更容易联系.
public void S() {
if (currentToken == "if") {
getNextToken();
E();
if (currentToken == "then") {
getNextToken();
S();
if (currentToken == "else") {
getNextToken();
S();
Return;
}
} else {
throw new IllegalTokenException("Procedure S() expected a 'then' token " + …Run Code Online (Sandbox Code Playgroud) 我希望以纯粹的功能方式合并F#中的2个列表.我很难理解语法.
假设我有一个元组 ([5;3;8],[2;9;4])
当我调用该函数时,它应该返回 [5;2;3;9;8;4]
这就是我到目前为止的原因,我确信这是错误的.如果有人能以简单的方式解释,我将不胜感激.
let rec interleave (xs,ys) = function
|([], ys) -> ys
|(x::xs, y::ys) -> x :: y:: interleave (xs,ys)
Run Code Online (Sandbox Code Playgroud) 可能重复:
F# - 两个列表的交叉乘积
在F#中有效地投影列表列表
我有一个函数,它接受两个整数列表,并返回一个包含所有笛卡儿积的列表.我认为我有正确的想法,但没有正确的实施.我可以得到一些指示吗?
let rec cartesian = function
| ([],[]) -> []
| (xs,[]) -> []
| ([],ys) -> []
| (x::xs,ys) -> List.map(fun y -> (x,y)::[]) cartesian (xs,ys)
Run Code Online (Sandbox Code Playgroud) 我试图理解这两个函数的时间复杂度.我试过试验这两个,这就是我想出来的
List.foldBack (@) [[1];[2];[3];[4]] [] => [1] @ List.foldBack (@) [[2];[3];[4]] []
=> [1] @ ([2] @ List.foldBack (@) [[3];[4]] [])
=> [1] @ ([2] @ ([3] @ List.foldBack (@) [4] []))
=> [1] @ ([2]@([3] @ ([4] @ List.foldBack[])))
=> [1]@([2]@([3]@([4]@([])))
=> [1; 2; 3; 4]
List.fold (@) [] [[1];[2];[3];[4]]
=> List.fold (@) (([],[1])@ [2]) [[3];[4]]
=> List.fold (@) ((([]@[1])@[2])@[3]) [[4]]
=> List.fold (@) (((([]@[1])@[2])@[3])@[4]) []
=> (((([]@[1])@[2])@[3])@[4])
Run Code Online (Sandbox Code Playgroud)
现在在我看来它们都是线性的,因为它需要相同的计算量来实现相同的结果.我是正确还是有些东西我错过了?
我有这个代码由我的导师提供.我应该通过查找mergesort中的f#类型来修复它.当我尝试发送到交互式时,我得到一个错误.我问我的proffesor出了什么问题,他说这是由于课堂网站上的格式错误造成的.我已经尝试添加空格删除你命名的空格,但每次我得到一个
~vs4489.fsx(8,14):错误FS0588:阻止此'let'未完成.期待一个表达.
关于最后两种方法.我怎样才能解决这个问题?
这是代码
let rec merge = function
| ([], ys) -> ys
| (xs, []) -> xs
| (x::xs, y::ys) -> if x < y then x :: merge (xs, y::ys)
else y :: merge (x::xs, ys)
let rec split = function
| [] -> ([], [])
| [a] -> ([a], [])
| a::b::cs -> let (M,N) = split cs
(a::M, b::N)
let rec mergesort = function
| [] -> []
| L -> let (M, N) = …Run Code Online (Sandbox Code Playgroud) 让我们说我有一个功能
let makeMonitoredFun f =
let c = ref 0
(fun x -> c := !c+1; printf "Called %d times.\n" !c; f x);;
Run Code Online (Sandbox Code Playgroud)
为什么我不被允许这样做.
let mrev = makeMonitoredFun List.rev
Run Code Online (Sandbox Code Playgroud) 可能重复:
从命令行将参数传递给C程序
我试图将终端中的三个参数传递给一个名为replace的函数.我想知道是否可以从终端进行以下操作
% ./replace d DDD mytest.tx
Run Code Online (Sandbox Code Playgroud)
我已经在线查看,但只能找到有关将值直接传递给main()而不是内部函数的信息.
编辑:我编辑了以下主要功能:
void replace(char* string_a, char* string_b, char* string_f)
{
}
int main(int argc, char *argv[])
{
if(argc < 4)
{
printf("Not enough arguments\n");
return 0;
}
replace(argv[1],argv[2],argv[3]);
}
Run Code Online (Sandbox Code Playgroud) 我想实现一个函数,它将大小为n和列表作为输入.此函数会将列表切割为两个列表,一个是大小n,另一个是另一个列表.我是这门语言的新手,很难学习语法.
我遇到的主要问题是找到一种方法来表达列表的大小而不使用任何循环或可变变量.
任何人都可以给我一些指示吗?