Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax Algol:正确的语法会导致编译中出现问题吗?_Syntax_Compiler Errors_Algol68 - Fatal编程技术网

Syntax Algol:正确的语法会导致编译中出现问题吗?

Syntax Algol:正确的语法会导致编译中出现问题吗?,syntax,compiler-errors,algol68,Syntax,Compiler Errors,Algol68,下面是一个相对简单的代码,用于在半径为2个单位的圆象限上使用中间坐标规则计算pi main.alg 我得到以下错误: a68g: syntax error: 1: possibly a missing or erroneous separator nearby. sh-4.3$ a68g main.alg

下面是一个相对简单的代码,用于在半径为2个单位的圆象限上使用中间坐标规则计算pi

main.alg

我得到以下错误:

a68g: syntax error: 1: possibly a missing or erroneous separator nearby.                                                                             
sh-4.3$ a68g main.alg                                                                                                                                
13                sumy := sumy + y;                                                                                                                  
                              1                                                                                                                  
a68g: warning: 1: skipped superfluous semi-symbol.                                                                                                   
15            pi := sumy * (2.0 / n);                                                                                                                
          1                                                                                                                                      
a68g: syntax error: 1: possibly a missing or erroneous separator nearby.  
试试看

我做错了什么?如何纠正

简单的回答是: 以下代码修复了您的特定问题

要记住的一点是;是一个语句分隔符。。。因此,所有复合语句都应该将每个语句用;。。例如,考虑:

statement; statement; statement # is a valid program #
statement; statement statement; # is not valid #

(statement; statement; statement) # is a valid program #
(statement; statement; statement;) # is not valid #
(statement; statement; statement); # is not valid #
寓意是。。。将所有的陈述用一个字母分开;不要把它放在纸上;在最后一句话之后。例如在结束、结束、结束或结束之前

BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
    sumy := 0.0;

    FOR p BY 2 TO n+n-1 DO 
        x := p/n;
        y := sqrt(4.0 - x**2);
        sumy := sumy + y
    OD;
    pi := sumy * (2.0 / n);
    print((n,pi))
OD
END
有趣的是,您经常可以使用a而不是;,这告诉编译器您不在乎语句的运行顺序。它被称为GOMMA。go-on和逗号的缩写

e、 g.应该谨慎使用GOMMA,因为编译器不需要警告您有关副作用的信息。。。比如说在理论上

#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #

INT x:=0;
(x+:=1, x+:=2); # allow the compiler the choice of threading #
PAR(x+:=10, x+:=20); # force statements into different threads #
printf(($"Answer="gl$,x))
答案是什么。。。它可能是33,但也可能是21或12等等,这取决于您的编译器

在本例中,+:=操作非常小且快速,因此答案可能是33

答案很长: 语句分隔符在语言中的位置多年来引起了人们的悲痛。例如,考虑下面的带有缺失逗号的FORTRAN代码:

DO 999 I=1 1000
  PRINT *,I
999 CONTINUE
此错误是在启动之前发现并更正的。城市神话中有这样一种说法,那就是这辆车也有一个类似的错误导致它坠毁

请注意,伪语句通常很有用,这用于满足语法/语义要求。Python作为各种示例,例如:None、NoneType和pass。Algol68有VOID、SKIP和~

演示SKIP或~的用法

BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
    sumy := 0.0;

    FOR p BY 2 TO n+n-1 DO 
        x := p/n;
        y := sqrt(4.0 - x**2);
        sumy := sumy + y; SKIP # insert a "fake statement after the ";" #
    OD; # the ";" is still needed #
    pi := sumy * (2.0 / n);
    print((n,pi))
OD
END
SKIP通常用于允许代码被清晰地注释掉:

statement1;
statement2;
SKIP COMMENT
statement3;
statement4 # eg. no ";" on the last statement #
END COMMENT
如果没有跳过,程序将无法编译

在Algol68的例子中,有一个奇怪的例子是模棱两可的。这种模糊性一直困扰着许多编程语言,包括Ada和python,甚至可能是C

要了解更多信息,请访问您的大学图书馆并阅读:-作者:C.H.Lindsey-[包括通过邮件对语言设计过程修订的坦率反映,语言功能难以弯曲,包括/排除歧义,例如Yoneda的歧义和乱伦结合]

在python中,他们试图通过使分隔符可选并用缩进隐藏分隔符来避开分隔符。。。但是逗号的歧义仍然存在。。发现语法/语义错误,并在下面的运行时错误

print [i for i in ()]
print [i for i in (1)]
print [i for i in (1,2)]
print [i for i in (1,2,3)]
ab="ab etc etc etc"
print "first 2 only: %c,%c"%ab[0:2]
C还有一点问题,我应该把分号和逗号放在哪里。。。逻辑是,;永远不必遵循},如始终;}但决不};。。。事实证明,有时候你确实需要;}

然后,C完全抛出了一个扳手,在工程中用逗号表示从不,但有时

1968年的Algol68确实为此类歧义生成了错误消息。这个故事的寓意可能是:如果你的编译器在编译时没有发现这种歧义,那么也许你应该选择另一种语言

顺便说一句:你可以找到一些示例Algol68程序。。。下一步是删除锐利边缘的代码

INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL x)REAL: sqrt(4 - x**2);

FOR n FROM lower limit BY interval TO upper limit DO
    REAL sum y := 0;

    FOR p FROM 1 BY 2 TO 2*n DO
        REAL x = p/n;
        REAL y = circle(x);
        sum y +:= y
    OD;
    REAL pi := sum y * 2 / n;
    printf(($g(0)": "g(-real width,real width-2)l$,n,pi))
OD
比较代码更改,看看您是否能找出效果以及它们提供了什么提示…:-

或者。。。下面是一个标准的数值求积程序如何被编码以供共享。注意传递函数作为参数的使用,特别是这里有一个叫做Currying的概念,circle2。。。这里逗号很重要

INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL radius, x)REAL: sqrt(radius**2 - x**2);

PROC mid point integrate = (PROC(REAL)REAL f, REAL lwb, upb, INT num steps)REAL: (
  REAL dx := (upb - lwb ) / num steps;
  REAL x := lwb + dx/2;
  REAL sum y := 0;

  FOR p TO num steps DO
      REAL y = f(x);
      sum y +:= y;
      x +:= dx
  OD;
  sum y * dx
);

FOR num steps FROM lower limit BY interval TO upper limit DO
  REAL pi := mid point integrate(circle(2,),0,2,num steps);
  printf(($g(0)": "g(-real width,real width-2)l$,num steps,pi))
OD
简单的回答是: 以下代码修复了您的特定问题

要记住的一点是;是一个语句分隔符。。。因此,所有复合语句都应该将每个语句用;。。例如,考虑:

statement; statement; statement # is a valid program #
statement; statement statement; # is not valid #

(statement; statement; statement) # is a valid program #
(statement; statement; statement;) # is not valid #
(statement; statement; statement); # is not valid #
寓意是。。。将所有的陈述用一个字母分开;不要把它放在纸上;在最后一句话之后。例如在结束、结束、结束或结束之前

BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
    sumy := 0.0;

    FOR p BY 2 TO n+n-1 DO 
        x := p/n;
        y := sqrt(4.0 - x**2);
        sumy := sumy + y
    OD;
    pi := sumy * (2.0 / n);
    print((n,pi))
OD
END
有趣的是,您经常可以使用a而不是;,这告诉编译器您不在乎语句的运行顺序。它被称为GOMMA。go-on和逗号的缩写

e、 g.应该谨慎使用GOMMA,因为编译器不需要警告您有关副作用的信息。。。比如说在理论上

#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #

INT x:=0;
(x+:=1, x+:=2); # allow the compiler the choice of threading #
PAR(x+:=10, x+:=20); # force statements into different threads #
printf(($"Answer="gl$,x))
答案是什么。。。它可能是33,但也可能是21或12等等,这取决于您的编译器

在本例中,+:=操作非常小且快速,因此答案可能是33

答案很长: 语句分隔符在语言中的位置多年来引起了人们的悲痛。例如,考虑下面的带有缺失逗号的FORTRAN代码:

DO 999 I=1 1000
  PRINT *,I
999 CONTINUE
此错误是在启动之前发现并更正的。城市神话中有这样一种说法,那就是这辆车也有一个类似的错误导致它坠毁

请注意,伪语句通常很有用,这用于满足语法/语义要求。Python作为各种示例,例如:None、NoneType和pass。 Algol68有VOID、SKIP和~

演示SKIP或~的用法

BEGIN
REAL x, y, sumy, pi;
INT n := lowerlimit, p := 1, lowerlimit := 10, upperlimit := 100, interval := 10;

FOR n BY interval TO upperlimit DO
    sumy := 0.0;

    FOR p BY 2 TO n+n-1 DO 
        x := p/n;
        y := sqrt(4.0 - x**2);
        sumy := sumy + y; SKIP # insert a "fake statement after the ";" #
    OD; # the ";" is still needed #
    pi := sumy * (2.0 / n);
    print((n,pi))
OD
END
SKIP通常用于允许代码被清晰地注释掉:

statement1;
statement2;
SKIP COMMENT
statement3;
statement4 # eg. no ";" on the last statement #
END COMMENT
如果没有跳过,程序将无法编译

在Algol68的例子中,有一个奇怪的例子是模棱两可的。这种模糊性一直困扰着许多编程语言,包括Ada和python,甚至可能是C

要了解更多信息,请访问您的大学图书馆并阅读:-作者:C.H.Lindsey-[包括通过邮件对语言设计过程修订的坦率反映,语言功能难以弯曲,包括/排除歧义,例如Yoneda的歧义和乱伦结合]

在python中,他们试图通过使分隔符可选并用缩进隐藏分隔符来避开分隔符。。。但是逗号的歧义仍然存在。。发现语法/语义错误,并在下面的运行时错误

print [i for i in ()]
print [i for i in (1)]
print [i for i in (1,2)]
print [i for i in (1,2,3)]
ab="ab etc etc etc"
print "first 2 only: %c,%c"%ab[0:2]
C还有一点问题,我应该把分号和逗号放在哪里。。。逻辑是,;永远不必遵循},如始终;}但决不};。。。事实证明,有时候你确实需要;}

然后,C完全抛出了一个扳手,在工程中用逗号表示从不,但有时

1968年的Algol68确实为此类歧义生成了错误消息。这个故事的寓意可能是:如果你的编译器在编译时没有发现这种歧义,那么也许你应该选择另一种语言

顺便说一句:你可以找到一些示例Algol68程序。。。下一步是删除锐利边缘的代码

INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL x)REAL: sqrt(4 - x**2);

FOR n FROM lower limit BY interval TO upper limit DO
    REAL sum y := 0;

    FOR p FROM 1 BY 2 TO 2*n DO
        REAL x = p/n;
        REAL y = circle(x);
        sum y +:= y
    OD;
    REAL pi := sum y * 2 / n;
    printf(($g(0)": "g(-real width,real width-2)l$,n,pi))
OD
比较代码更改,看看您是否能找出效果以及它们提供了什么提示…:-

或者。。。下面是一个标准的数值求积程序如何被编码以供共享。注意传递函数作为参数的使用,特别是这里有一个叫做Currying的概念,circle2。。。这里逗号很重要

INT lower limit = 10, upper limit = 100, interval = 10;

PROC circle = (REAL radius, x)REAL: sqrt(radius**2 - x**2);

PROC mid point integrate = (PROC(REAL)REAL f, REAL lwb, upb, INT num steps)REAL: (
  REAL dx := (upb - lwb ) / num steps;
  REAL x := lwb + dx/2;
  REAL sum y := 0;

  FOR p TO num steps DO
      REAL y = f(x);
      sum y +:= y;
      x +:= dx
  OD;
  sum y * dx
);

FOR num steps FROM lower limit BY interval TO upper limit DO
  REAL pi := mid point integrate(circle(2,),0,2,num steps);
  printf(($g(0)": "g(-real width,real width-2)l$,num steps,pi))
OD

感谢您的精彩、广泛和信息丰富的回答!顺便说一句:Algol68还有其他一些东西有点古怪,但很有趣。例如,在Algol68中,程序员在声明变量时不需要屈服。他们可以声明并使用变量sumy和上限,如下所示:实x,y,和y,pi;INT n:=下限,p:=1,下限=10,上限=100,区间=10;结构x+=1,x+=2是一个附属子句,逗号只是一个逗号符号。我相信你把“gomma”搞错了。在过程调用中,实际参数由逗号fooa、b分隔,并按未定义的顺序进行详细阐述。原始报告允许gommas代替逗号:fooa;b强制调用方选择实际参数的串行细化。i、 例如,gomma的作用与你所说的相反:它强制了精化的顺序。修订报告中删除了gomma。re:gomma。。。的确,你是对的;是一个gomma,和,是一个逗号。i、 e.我刚刚检查了第3.1.1节中的最终报告r0。f它表明持续符号为:;或我想,.gomma是为字符集不包含分号的计算机设计的。。。这么多年来我都可以把分号叫做gomma-感谢您的精彩、广泛和信息丰富的回答!顺便说一句:Algol68还有其他一些东西有点古怪,但很有趣。例如,在Algol68中,程序员在声明变量时不需要屈服。他们可以声明并使用变量sumy和上限,如下所示:实x,y,和y,pi;INT n:=下限,p:=1,下限=10,上限=100,区间=10;结构x+=1,x+=2是一个附属子句,逗号只是一个逗号符号。我相信你把“gomma”搞错了。在过程调用中,实际参数由逗号fooa、b分隔,并按未定义的顺序进行详细阐述。原始报告允许gommas代替逗号:fooa;b强制调用方选择实际参数的串行细化。i、 例如,gomma的作用与你所说的相反:它强制了精化的顺序。修订报告中删除了gomma。re:gomma。。。的确,你是对的;是一个gomma,和,是一个逗号。i、 e.我刚刚检查了第3.1.1节中的最终报告r0。f它表明持续符号为:;或我想,.gomma是为字符集不包含分号的计算机设计的。。。这么多年来我都可以把分号叫做gomma-