【问题标题】:Error: syntax error, unexpected "Identifier", expecting EXTERNAL or GLOBAL错误:语法错误,意外的 \"Identifier\",需要 EXTERNAL 或 GLOBAL
【发布时间】:2022-02-25 03:02:27
【问题描述】:

嗨,我想知道你们是否可以帮助我解决这个错误。我对 cobol 很陌生,因为它是我专业的第一个(也是唯一一个)cobol 课程。

我不断收到此错误 lab3a.cob:23: Error: syntax error, unexpected "Identifier", expecting EXTERNAL or GLOBAL

每当我尝试编译时。而且我似乎看不出我做错了什么。

我的代码

   IDENTIFICATION DIVISION.
   PROGRAM-ID. "LAB3A".
   Author.     Fielding Featherston
   * Takes inputs from file and seperates.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT InFile
        ASSIGN to "lab3-in.dat" 
        ORGANIZATION is LINE SEQUENTIAL.
   
   DATA DIVISION.
   FILE SECTION.
   FD   InFile.
   01       InString.
        05              PIC X(13).
        05  Instrument  PIC X(12).
             88  Brass       value "Bugle" "Flugelhorn" 
                                   "Sousaphone" "Trombone"
                                   "Trumpet" "Tuba".
             
             88  Percussion  value "Bass Drum" "Bells" "Bongos"
                                   "Castanets" "Chimes" "Cymbals"
                                   "Snare Drum" "Xylophone".
             
             88  Strings     value "Banjo" "Bass" "Cello" "Guitar"
                                   "Harp" "Lyre" 
                                   "Mandolin" "Violin".
             
             88  Woodwind    value "Bagpipes" "Bassoon" "Clarinet"
                                   "Flute" "Oboe" 
                                   "Piccolo" "Saxophone".                                      
   WORKING-STORAGE SECTION.
   01   BrassCount      PIC 9(3).
   01   PerCount        PIC 9(3).
   01   StringCount     PIC 9(3).
   01   WoodCount       PIC 9(3).
   01   OtherCount      PIC 9(3).
   01   BrassStr        PIC ZZ9.
   01   PerStr          PIC ZZ9.
   01   StringStr       PIC ZZ9.
   01   WoodStr         PIC ZZ9.
   01   OtherStr        PIC ZZ9.
   01   InStringLength  PIC 99.
   01   EndFileStr      PIC X VALUE "n".                                      
        88  EndFile         VALUE "y"
                            When Set to False is "y".

   PROCEDURE DIVISION.
   000-Main.
       Open Input InFile
       Perform until EndFile
           Read InFile
               At end
                   Set EndFile to FALSE
               Not at End
                   PERFORM 100-SeperateStrings
                   PERFORM 200-ClassCount
           END-READ
       END-PERFORM
       CLOSE InFile
       Move BrassCount  to BrassStr
       Move PerCount    to PerStr
       Move StringCount to StringStr
       Move WoodCount   to WoodStr
       Move OtherCount  to OtherStr
       DISPLAY "Counts"
       DISPLAY "    Brass:       " FUNCTION TRIM(BrassStr)
       DISPLAY "    Percussion:  " FUNCTION TRIM(PerStr)
       DISPLAY "    String:      " FUNCTION TRIM(StringStr)
       DISPLAY "    Woodwind:    " FUNCTION TRIM(WoodStr)
       DISPLAY "    OTHER:       " FUNCTION TRIM(OtherStr)
       STOP RUN.

   100-SeperateStrings.
       MOVE FUNCTION Length(InString) to InStringLength
       UNSTRING InString (14:InStringLength)
           INTO Instrument
       END-UNSTRING.

   200-ClassCount.
       IF Brass
           Add 1 to BrassCount
       ELSE IF Percussion
           Add 1 to PerCount
       ELSE IF Strings
           Add 1 to StringCount
       ELSE IF Woodwind
           Add 1 to WoodCount
       ELSE
           Add 1 to OtherCount
       END-IF.              

【问题讨论】:

  • 你在哪一行代码上得到这个?
  • 第 23 行是“88 Percussion value "Bass Drum" "Bells" "Bongos""
  • 注释“*”应该在第 7 列中,并且您缺少 endfile 后面的注释的注释指示符。
  • 我把评论拿出来检查,它仍然给了我上面提到的第 23 行的语法错误。

标签: syntax syntax-error cobol


【解决方案1】:

错误上下文中的EXTERNALGLOBAL 子句可能只出现在记录描述条目中;即,以101 开头的数据条目。鉴于错误发生在两个88 级别项目之间,看来编译器是使困惑关于它在扫描源代码时的位置。

有一些异常可能会导致编译器出现问题的格式。特别是,第 22 行包含许多标签不应该但可能会混淆编译器的字符。此外,第 33 和 46 行包含许多标签每个源代码行末尾的字符导致行超过 72 个字符。

另一个可能的问题是选项卡的扩展,无论每个标签字符被编译器替换为 4 或 8 个空格。这同样会影响文本是否超过 72 个字符。在没有 SOURCE FORMAT 指令的情况下,第 72 列之后的源文本将被忽略。

在您知道制表符对源代码的影响之前,我建议将所有制表符替换为空格。

【讨论】:

  • 我根本没有打卡。但我想通了。很难看到 Notepad ++ 上的间距,所以我切换到 VS Code。这是我的值条目排列位置的间距问题。不过,TH = hanks 的帮助。
  • @FieldingFeatherston - 在 Notepad++ 中,转到设置 --> 首选项 --> 语言。检查:“用空格替换”。另请参阅superuser.com/a/1651618
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多