完全モジュラーC:グレーディング
あなたは、Cプログラミング言語を教えるコンピューターサイエンスの教授です。学生に伝えたい原則の1つはモジュール性です。残念ながら、過去のクラスはメッセージを受信しない傾向があり、プログラム全体を使用して課題を提出していましたmain()。したがって、この学期では、学生を採点するための厳格なモジュール化ガイドラインを発行しました。 Cの文法のサブセットと「整形式」の翻訳単位の規則を以下に定義します。これらの規則に従うコードは、キーワードである識別子が使用されない限り、有効なC89である必要があります。 仕事 Cコードを含むとされる文字列を入力として受け取ります。この文字列には、スペース、改行、および文字のみが含まれていると想定できますabcdefghijklmnopqrstuvwxyz123456789(){},+-*/%;=。 コードは、次のルーブリックに従って、学生の課題が受け取るポイント数を出力する必要があります。 translation-unit文法により、入力は無効です:0ポイント 入力は文法に従いますが、以下のルールに従って「整形式」ではありません:1ポイント 入力は整形式の翻訳単位ですが、完全にモジュール化されていません:2ポイント 入力は完全にモジュール化された整形式の翻訳単位です:3ポイント トークンの定義 identifier:1つ以上の英小文字のシーケンス。識別子がC89予約語1の場合、結果が予約語を無視していたであろうものの代わりに、オプションで0を返すことができます。予約語の識別子としての使用を検出することに一貫性がある必要はありません。場合によってはフラグを立てて、他のインスタンスに渡すこともできます。 integer-literal:1桁以上の数字1から9のシーケンス(文字0が入力に表示されないことが保証されていることを思い出してください) 他の有効なトークンは文法で文字通り定義されています。 文字が空白でない場合に限り、文字はトークンに属している必要があります。 2つの連続した英数字は、同じトークンの一部である必要があります。 EBNF文法 var-expr = identifier literal-expr = integer-literal binary-op = "+" | "-" | "*" | "/" | "%" binary-expr = expr binary-op expr paren-expr = "(" expr ")" call-expr = identifier "(" [ expr ( …