タグ付けされた質問 「grammar」

20
C ++は状況依存ですか、状況依存ですか?
C ++は状況依存言語であるという主張をよく耳にします。次の例を見てください。 a b(c); これは変数定義ですか、関数宣言ですか?それは記号の意味に依存しcます。場合cである変数は、その後、a b(c);名前の変数を定義bタイプのをa。で直接初期化されcます。しかし、cがタイプの場合、を取り、を返すa b(c);という名前の関数を宣言します。bca 文脈自由言語の定義を調べると、基本的に、すべての文法規則の左側には、1つの非終端記号だけが含まれている必要があることがわかります。一方、状況依存の文法では、左側に終端記号と非終端記号の任意の文字列を使用できます。 「C ++プログラミング言語」の付録Aを閲覧したところ、左側に単一の非終端記号以外に何もない単一の文法規則が見つかりませんでした。これは、C ++がコンテキストフリーであることを意味します。(もちろん、すべての文脈自由言語は、文脈自由言語が文脈依存言語のサブセットを形成するという意味で文脈依存でもありますが、それが目的ではありません。) では、C ++はコンテキストフリーですか、それともコンテキスト依存ですか?

20
int a [] = {1,2、}; 奇妙なカンマが許可されています。何か特別な理由は?
多分私はこの惑星の出身ではないかもしれませんが、以下は構文エラーであるように思えます: int a[] = {1,2,}; //extra comma in the end しかし、そうではありません。このコードがVisual Studioでコンパイルされたときは驚きましたが、C ++のルールに関してはMSVCコンパイラを信頼しないことを学んだので、標準を確認しましたが、標準でも許可されています。あなたが私を信じないなら、あなたは文法規則のために8.5.1を見ることができます。 なぜこれが許可されるのですか?これは愚かな役に立たない質問かもしれませんが、なぜ私が尋ねているのか理解して欲しいのです。それが一般的な文法規則のサブケースである場合、私は理解するだろう-彼らは、初期化子リストの末尾に冗長なコンマを許可しないために、一般的な文法をこれ以上難しくしないことに決めました。ただし、追加のコンマは明示的に許可されています。たとえば、関数呼び出しの引数リストの最後に冗長なコンマを含めることはできません(関数がを受け取る場合...)。これは正常です。 繰り返しますが、この冗長なコンマが明示的に許可されている特別な理由はありますか?

6
C ++がLR(1)パーサーで解析できないのはなぜですか?
私はパーサーとパーサージェネレーターについて読んでいて、このステートメントをウィキペディアのLR解析ページで見つけました。 多くのプログラミング言語は、LRパーサーのバリエーションを使用して解析できます。注目すべき例外の1つはC ++です。 なぜそうなのですか?C ++の特定のプロパティにより、LRパーサーで解析できなくなりますか? Googleを使用して、CはLR(1)で完全に解析できることがわかりましたが、C ++ではLR(∞)が必要です。

2
文脈自由文法とは何ですか?
誰かが文脈自由文法とは何かを私に説明できますか?Wikipediaのエントリ、次に正式な文法のWikipediaのエントリを調べた後、私は完全に戸惑いました。誰かがこれらのことを説明できるほど親切でしょうか? 構文解析と、正規表現エンジンの制限についても調査したいので、これは不思議に思っています。 これらの用語が直接プログラミングに関連しているか、一般的に言語学に関連しているかはわかりません。その場合は、申し訳ありませんが、もしそうであれば移動できますか?

8
LR、SLR、およびLALRパーサーの違いは何ですか?
LR、SLR、およびLALRパーサーの実際の違いは何ですか?SLRとLALRはLRパーサーのタイプであることを知っていますが、それらの解析テーブルに関する限り、実際の違いは何ですか? また、文法がLR、SLR、またはLALRであるかどうかを示す方法は?LL文法の場合、解析テーブルのセルに複数のプロダクションルールが含まれていてはならないことを示す必要があります。LALR、SLR、およびLRに同様のルールはありますか? たとえば、どのように文法を示すことができますか S --> Aa | bAc | dc | bda A --> d LALR(1)ではなくSLR(1)ですか? 編集(ybungalobill):LALRとLRの違いは何なのか、満足のいく答えが得られませんでした。したがって、LALRのテーブルはサイズが小さくなりますが、認識できるのはLR文法のサブセットのみです。誰かがLALRとLRの違いについて詳しく説明できますか?LALR(1)とLR(1)で回答できます。どちらも1トークンの先読みを使用し、どちらもテーブル駆動型です。それらはどのように違うのですか?

1
JavaをCよりも解析しやすくするものは何ですか?
CとC ++の文法はコンテキスト依存であり、特にCで「レクサーハック」が必要であるという事実を知っています。一方、Javaのみを解析できるという印象を受けました2つの言語間のかなりの類似性にもかかわらず、先読みの2つのトークン。 解析しやすくするために、Cについて何を変更する必要がありますか? 私がCの状況依存性を見た例はすべて技術的には許容できるが、ひどく奇妙なので、私は尋ねます。例えば、 foo (a); foo引数付きのvoid関数を呼び出している可能性がありますa。または、それaはタイプのオブジェクトであると宣言することfooもできますが、同様に簡単に括弧を取り除くことができます。この奇妙さは、C文法の「直接宣言子」生成規則が関数と変数の両方を宣言するという二重の目的を満たすために発生します。 一方、Java文法では、変数宣言と関数宣言に別々の生成規則があります。あなたが書くなら foo a; すると、それが変数宣言でありfoo、型名として明確に解析できることがわかります。foo現在のスコープのどこかにクラスが定義されていない場合、これは有効なコードではない可能性がありますが、これは、後のコンパイラパスで実行できるセマンティック分析の仕事です。 typedefのためにCは解析が難しいと言われているのを見てきましたが、Javaでも独自の型を宣言できます。に加えてdirect_declarator、どのC文法規則に誤りがありますか?
90 java  c  parsing  grammar 

3
TSVテキストを解析するためのRaku文法を定義するにはどうすればよいですか?
TSVデータがあります ID Name Email 1 test test@email.com 321 stan stan@nowhere.net これを解析してハッシュのリストにしたい @entities[0]<Name> eq "test"; @entities[1]<Email> eq "stan@nowhere.net"; 改行メタ文字を使用してヘッダー行と値行を区切るのに問題があります。私の文法定義: use v6; grammar Parser { token TOP { <headerRow><valueRow>+ } token headerRow { [\s*<header>]+\n } token header { \S+ } token valueRow { [\s*<value>]+\n? } token value { \S+ } } my …
13 csv  grammar  raku 

1
EOS(End of String)でのRaku文法の停止
楽のDSL能力を習得するための言い訳として、ある音楽言語から別の言語(ABCからAlda)への翻訳者を書く過程で、.parse!を終了する方法がないようです。これが私の短いデモコードです: #!/home/hsmyers/rakudo741/bin/perl6 use v6d; # use Grammar::Debugger; use Grammar::Tracer; my $test-n01 = q:to/EOS/; a b c d e f g A B C D E F G EOS grammar test { token TOP { <score>+ } token score { <.ws>? [ | <uc> | <lc> ]+ <.ws>? } token uc …
9 parsing  grammar  raku 

2
あいまいさを処理できる文法のセットアップ方法
私が考案したExcelのような数式を解析するための文法を作成しようとしています。この場合、文字列の先頭の特殊文字は別のソースを示します。たとえば、$は文字列を表すことができるため、「$This is text」はプログラムでは文字列入力として扱われ&、関数を表すことができるため&foo()、内部関数の呼び出しとして扱うことができますfoo。 私が直面している問題は、文法を適切に構築する方法です。たとえば、これはMWEとして簡略化されたバージョンです。 grammar = r'''start: instruction ?instruction: simple | func STARTSYMBOL: "!"|"#"|"$"|"&"|"~" SINGLESTR: (LETTER+|DIGIT+|"_"|" ")* simple: STARTSYMBOL [SINGLESTR] (WORDSEP SINGLESTR)* ARGSEP: ",," // argument separator WORDSEP: "," // word separator CONDSEP: ";;" // condition separator STAR: "*" func: STARTSYMBOL SINGLESTR "(" [simple|func] (ARGSEP simple|func)* ")" %import common.LETTER %import …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.