3
votes

I am learning compilers and I am troubled by how to create the context-free grammar of a language. Is there a method I can follow to create the context-free grammar for most language ? I'm new to this field so the question is basic,and I hope you can help me.

1
This question is too broad. I looked at this and it seems straight forward enough- cs.rochester.edu/~nelson/courses/csc_173/grammars/cfg.htmlMatthewMartin

1 Answers

1
votes

Most language specifications come with a grammar formalism that gives you a basis for designing a specific grammar.

The need for a specific grammar comes from a choice of parser technology; your grammar will have to honor the limitations (they all have some) of that parser technology. So your first question should be, "What parser generator am I going to use?" (including if you insist, "none [recursive descent]" followed by a careful consideration of why you are using that parser generator (often being, "its the first thing I found, or Mikey likes it", both of which are rotten reasons). In particular, having considered a specific parser generator, you can consider the language spec itself to decide if the parser generators's shortcomings are likely to be an issue. This choice isn't helped much by the huge set of possible answers, but that's your problem as a an engineer.

Once you've chosen a parser generator, then you take the grammar formalism from the language spec, and try to bend it to the parser generator's limitations. This is where most of your "creation" work will come from. The experience of doing this several times on smaller languages is pretty helpful when faced with doing a large complex language.

If you have a langauge with no obvious reference grammar, you have a much harder time. YOu'll have to guess at grammar rules for the various langauge constructs, and how those rules are combined into larger program structures. If this is the problem you facing, you better have had experience building a number of other working grammars or you are likely to be hopelessly lost. (COBOL is really fun here.)

Once you get a grammar that is apparently acceptable to your parser generator, then you need to run as much code for that language as you can through your parser. This is to help uncover mistakes in your grammar, and inconsistencies or misintretations of the standard document. You will also find that source code for "your language" as processed by other compilers may contain a lot of surprises, added by the other compilers, just because they can.

Good luck.