首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Algol:正确的语法会导致编译问题吗?

Algol:正确的语法会导致编译问题吗?
EN

Stack Overflow用户
提问于 2017-03-13 13:13:27
回答 1查看 713关注 0票数 1

这是一个相对简单的代码,用于“在半径为2的圆象限上使用中坐标规则计算pi”。

main.alg

代码语言:javascript
复制
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

我得到以下错误:

代码语言:javascript
复制
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.  

试试吧,住在这里

我做错了什么?怎么改正呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 02:16:04

简短的答案:,下面的代码修复了您的特定问题.

要记住的是";“是”语句分隔符“.因此,所有“复合语句”都应该将每个语句分隔为“;”。例如:

代码语言:javascript
复制
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 #

寓意是..。用";“分隔所有语句,不要在最后一句之后加上";”。(如在结束前,FI,DO,")“或ESAC)

代码语言:javascript
复制
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

值得注意的是,您可以经常使用",“而不是";",这告诉编译器您不在乎语句的运行顺序。它叫做GOMMA。( go on逗号的收缩)

例如,GOMMA应该谨慎使用,因为编译器不需要警告您副作用.例如(理论上)

代码语言:javascript
复制
#!/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代码:

代码语言:javascript
复制
DO 999 I=1 1000
  PRINT *,I
999 CONTINUE

汞项目启动之前,就发现并纠正了这个错误。城市神话中有这样的说法:水手计划有一个类似的错误,导致它崩溃。

注意,有“假”语句通常是有用的,这是用来满足语法/语义要求的。Python作为各种例子,例如:"None“、"NoneType”和"pass“。Algol68有“空”、“跳过”和"~“

演示跳过(或"~")的用法。

代码语言:javascript
复制
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经常被用来允许代码被清晰地注释掉:

代码语言:javascript
复制
statement1;
statement2;
SKIP COMMENT
statement3;
statement4 # eg. no ";" on the last statement #
END COMMENT

如果没有,跳过程序就不会编译。

在Algol68的例子中,有一个奇怪的例子--玉田的歧义。这种歧义一直困扰着许多编程语言,包括Ada和python,甚至可能还有C.

要想找到更多的信息,请到你的大学图书馆阅读:“阿尔戈勒68的历史” --由C.H.Lindsey撰写--包含了对语言设计过程“邮件修改”的坦率反思,语言特性斗争“弯曲”,包括/排除歧义(如Yoneda的歧义和乱伦结合)。

在python中,他们试图将“分隔器”设置为可选步骤,并将其隐藏在缩进中.但逗号模棱两可。例如:指出语法/语义错误,并在以下.

代码语言:javascript
复制
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还有点“我在哪里放分号和逗号”.逻辑是";“不需要跟随"}”(如总是“;},但绝不”};“.事实证明,有时 you do需要";};“

然后C完全抛出一个扳手在作品中的逗号与",)“,但有时"),。

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

顺便说一句:你可以找到一些样本Algol68程序这里.接下来是你的代码,去掉了锋利的边缘。

代码语言:javascript
复制
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

比较代码的变化,看看你是否能找出效果和他们提供什么提示.:-)

或.是如何将标准的数字求积程序编码成共享的。注意传递函数作为参数的用法,特别是这里有一个名为circle(2,) .逗号很重要的地方!

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42764576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档