-1

まだ C# は初めてなので、よろしくお願いします :)

S -> NP VP
S -> Aux NP VP
NP -> Proper-Noun
NP -> Nominal
Nominal -> Noun
Nominal -> Nominal Noun
Nominal -> Nominal PP
VP -> Verb NP
VP -> Verb NP PP
PP -> Preposition NP

これらのプロダクションを配列または表形式のリストに格納する方法は、C# で次のようになります。上記のプロダクションはファイルから読み込まれます。

Table Structure
terminals -> all non terminals after that specific terminal
S -> NP VP Aux NP VP VP
VP -> Verb NP Verb NP PP Verb PP
4

2 に答える 2

2

このようなものが役立つはずです:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

class Production
{
   public string Name;
   public string[] Components;

   public static IEnumerable<Production> Parse(string contents)
   {
      var rdr = new System.IO.StringReader(contents);
      string line;
      var productions = new List<Production>();
      while(null != (line = rdr.ReadLine()))
      {
         if(string.IsNullOrEmpty(line))
            continue;
         productions.Add(ParseOne(line));
      }

      return productions;
   }

   public static Production ParseOne(string line)
   {
      var parts = line.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries);
      return new Production{Name = parts[0], Components = parts.Skip(2).ToArray()};
   }

}

次のように Production.Parse メソッドを使用できます。

static void Main()
{      
   var productions = Production.Parse(@"S -> NP VP
S -> Aux NP VP
NP -> Proper-Noun
NP -> Nominal
Nominal -> Noun
Nominal -> Nominal Noun
Nominal -> Nominal PP
VP -> Verb NP
VP -> Verb NP PP
PP -> Preposition NP");
   // Or from a file like this:
   productions = Production.Parse(File.ReadAllText("myProductions.txt));
}

編集:プロダクションに参加するには、名前によるグループ化を検討してください。

productions.GroupBy(p => p.Name, p => new Production{Name=p.Key, Components=p.SelectMany(x => x)});
于 2012-12-21T04:52:51.937 に答える
0

これがデモ linq ソリューションです。エラーチェックは行わず、データが lines.txt という入力ファイルにあると仮定します。

編集:クエリを簡素化

static void Main(string[] args)
        {
            var lines = System.IO.File.ReadAllLines("lines.txt");

            var results = from line in lines
                     let tokens = line.Split(' ')
                     group tokens by tokens.First() into tokenGroup
                     select new
                     {
                         Terminal = tokenGroup.Key,
                         NonTerminals = tokenGroup.SelectMany(tokens => tokens.Skip(2))
                     };

            foreach (var line in results)
            {
                var sb = new StringBuilder(string.Format("{0} ->", line.Terminal));
                foreach (var nonTerminal in line.NonTerminals)
                {
                    sb.Append(string.Format(" {0}", nonTerminal));
                }
                Console.WriteLine(sb.ToString());
            }
        }
于 2012-12-21T05:09:30.977 に答える