小编use*_*706的帖子

递归下降解析器实现

我期待写一些递归下降解析器的伪代码.现在,我没有这种编码的经验.我在线阅读了一些例子,但它们只适用于使用数学表达式的语法.这是我基于解析器的语法.

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)

recursion parsing recursive-descent

15
推荐指数
2
解决办法
2万
查看次数

合并两个列表

我希望以纯粹的功能方式合并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)

recursion f# list f#-scripting

10
推荐指数
2
解决办法
2908
查看次数

笛卡尔积两个列表

可能重复:
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)

f# f#-interactive f#-scripting

4
推荐指数
1
解决办法
4868
查看次数

List.fold和foldBack的渐近时间复杂度

我试图理解这两个函数的时间复杂度.我试过试验这两个,这就是我想出来的

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)

现在在我看来它们都是线性的,因为它需要相同的计算量来实现相同的结果.我是正确还是有些东西我错过了?

algorithm complexity-theory f# f#-interactive

2
推荐指数
1
解决办法
872
查看次数

f#spacing和mergesort

我有这个代码由我的导师提供.我应该通过查找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)

f# f#-scripting

1
推荐指数
1
解决办法
561
查看次数

一流的功能

让我们说我有一个功能

 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)

f#

1
推荐指数
1
解决办法
192
查看次数

如何将参数从终端传递给函数

可能重复:
从命令行将参数传递给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)

c linux terminal

1
推荐指数
1
解决办法
2万
查看次数

将列表拆分为两个

我想实现一个函数,它将大小为n和列表作为输入.此函数会将列表切割为两个列表,一个是大小n,另一个是另一个列表.我是这门语言的新手,很难学习语法.

我遇到的主要问题是找到一种方法来表达列表的大小而不使用任何循环或可变变量.

任何人都可以给我一些指示吗?

f# list f#-scripting

0
推荐指数
2
解决办法
3817
查看次数