Re: C syntax errors

Narayanan Pillai <strqst400-/[email protected]>
Newsgroups gmane.comp.lang.as400.c
Message-ID <[email protected]>
Every so often a detailed reply such as this comes along, explaining an 
excruciatingly difficult concept with such breathtaking clarity, with 
such depth of vision and knowledge of history and realization dawns: I 
stand amongst GIANTS !

Thank you for all the insights that you share so freely.

Respectfully,
Pillai

On 01/18/2014 03:08 PM, Mark S Waterbury wrote:
> Hi, again, Frank:
>
> Setting aside the apparent "bad examples" on that web site ...
>
> Responding to your original questions about how to read and understand C
> syntax, the following might help you to comprehend it better.
>
> When Dennis Ritchie first designed C, it was not meant to be a "general
> purpose" programming language for all sorts of applications; it was
> meant as a "systems programming language' for use in developing the Unix
> operating system.   As such, it was intended to be much closer to a
> traditional "assembler language" than most other higher-level
> languages.  Like most assemblers, this included the idea of a "macro
> processor" to make certain coding tasks easier.
>
> Since it was not meant for a general audience, but was intended
> originally for their own use internally within Bell Labs, they did not
> have the goals of making it easy to read or understand for ordinary
> mortals. They wanted to create a concise notation that would be easy for
> the C compiler to parse and "understand".   Much of the terseness of C,
> such as the use of special characters like "{" and "}" instead of more
> traditional "begin" and "end" keywords was due to the equipment used at
> that time -- in the late '60s and early '70, they were using actual
> teletypes and similar low-speed terminals to interact with these
> minicomputers.  So, the goal was to reduce the number of keystrokes
> needed to represent a given statement.
>
> All of the early C compilers written by Dennis Ritchie were developed
> using "top-down, recursive descent" parsing techniques. This in part
> influenced the language design (syntax) and those early compilers gave
> reasonable "readable" syntax errors.  With Unix Version 7, for greater
> "portability," AT&T switched over to the new "Portable C Compiler" (PCC)
> developed using YACC and LEX (compiler writing tools). YACC is a
> "bottom-up" LALR parser generator. LALR table-driven parsers and the
> grammars they accept are notorious for generating syntax errors that
> often "make no sense" to humans looking at the compiler generated source
> listing.
>
> How to read C declarations
> =====================
> With the C language, "declarations" are probably the most difficult part
> of the language to comprehend (for most people).  A long time ago, I
> learned this heuristic ("trick") to aid in understanding C
> declarations:  Read them "from the middle out." What do I mean by this?
>
> Consider the following snippet of C code:
>
>       int    a[10];
>
> First, we find the "middle" -- the name of what is being declared, in
> this case, "a" -- then we look to the right and see that it is an array,
> as denoted by the presence of square brackets, and we see it is defined
> with 10 elements.  Then, from the "a", we look to the left to see that
> this is an array of integers.
>
> Now, consider the following:
>
>       char    *c;
>
> First, we find that "c" is what is being declared; next, we look to the
> right -- nothing there -- so looking to the left, we see that "c" is a
> pointer to character(s).      (Note that in C, a character string is
> represented by a pointer to the first character, and the "string" is
> terminated by a "null" character, x'00').
>
> Next, consider:
>
>       char    name[10] = "Waterbury";
>
> This declares name to be a 10 character array initialized to the string
> "Waterbury" (C automatically adds the null x'00' character to the end).
>
> Note that in early K&R C, this could also be declared as:
>
>       char    *name = "Waterbury";
>
> There is intentional ambiguity between arrays and pointers. The name of
> the array denotes the address of the first position of the array.  These
> ambiguities were chosen intentionally, to provide the same kind of
> low-level flexibility available to assembler language programmers of
> that day, and to try to allow programmers to squeeze as much performance
> out of the computers of that day as possible.  So, the following
> statement could be used to print the value of name:
>
>       printf(name);
>
> with either definition of name.
>
> Now, consider:
>
>       char *name[10];
>
> Here, we find "name" to be an array of 10 elements each of which
> contains a pointer to characters.
>
> One more example:
>
>       char    *month[] = { "January", "February", "March", "April",
> "May", "June",
>                   "July", "August", "September", "October", "November",
> "December"};
>
> Here, we have an array named "month" of pointers to characters, and the
> array elements are initialized (as seen to the right of the "="). So,
> this defines an array of 12 elements, each initialized to the name of
> each month, e.g. month[3] = "March".
>
> I hope this helps a little ...
>
> All the best,
>
> Mark S. Waterbury
>
>   > On 1/17/2014 5:38 PM, frank kolmann wrote:
>> I am new to C.
>>
>> Given that C compilers throw up Syntax errors at seemingly random places,
>> how do experienced programmers cope?
>> Any advice will be most welcome.
>> -rant on-
>> To me C is the antithesis of the KISS principal.  Given the convolutions
>> possible in C code I wonder how are any C programs written at all.
>> It seems that you need an ability to decompile C code in your head. The
>> forwards and backwards nature of deciphering a C definition is so arcane
>> that the only reason I can think why anyone would have designed such a
>> language is to show 'look at me, arnt I clever'.
>> C macro substitution seems to be a disaster waiting to happen. Who is
>> clever enough to construct a macro that can accept arbitrary input and yet
>> produce reliable results.
>> -rant off-
>> I fact I am trying to compile a bit of C code I found on the net  that
>> attempts to translate C constructs into words but it fails on the iSeries
>> with a syntax error.
>> Presumable it has compiled elsewhere.
>> http://www.c-program-example.com/2012/02/k-r-c-programs-exercise-5-20.html
>>
>> I though I was a programmer, I know Basic Fortran Cobol RPG(all variants)
>> but I realise now that I am just a mere dabbler and there exist super
>> beings with mystical abilities akin to sorcerers who program in C.
>>
>> Frank Kolmann

-- 
This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list
To post a message email: C400-L-Zwy7GipZuJhWk0Htik3J/[email protected]
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/c400-l
or email: C400-L-request-Zwy7GipZuJhWk0Htik3J/[email protected]
Before posting, please take a moment to review the archives
at http://archive.midrange.com/c400-l.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.