Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单反讽解析器不识别特定匹配项的多个实例_C#_Parsing_Irony - Fatal编程技术网

C# 简单反讽解析器不识别特定匹配项的多个实例

C# 简单反讽解析器不识别特定匹配项的多个实例,c#,parsing,irony,C#,Parsing,Irony,我试图创建一个简单的反讽解析器。语法应该是 能够识别其中的一个或多个 setlinkstring 它似乎成功地识别了一个关键字调用,但两个连续的关键字调用失败了。我得到一个错误状态。当我检查main中的parseTree变量时,我可以看到它在停止解析之前标识的最后一个标记是字母c,connect标记中的第一个字母。有人能告诉我这里缺少什么吗 code.txt的内容 setlink("stuffs"); connect("things"); LilGrammar.cs using Syst

我试图创建一个简单的反讽解析器。语法应该是

能够识别其中的一个或多个

setlinkstring

它似乎成功地识别了一个关键字调用,但两个连续的关键字调用失败了。我得到一个错误状态。当我检查main中的parseTree变量时,我可以看到它在停止解析之前标识的最后一个标记是字母c,connect标记中的第一个字母。有人能告诉我这里缺少什么吗

code.txt的内容

 setlink("stuffs");
 connect("things");
LilGrammar.cs

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Security;
 using System.Text;
 using System.Threading.Tasks;
 using Irony.Parsing;

 namespace IronyTest
 {
 public class LilGrammar : Grammar
 {
   public LilGrammar()
   {

        //Define terminals

       var program = new NonTerminal("program");
       var command = new NonTerminal("command");
       var commandList = new NonTerminal("commandList");
       var keyword = new NonTerminal("keyword");
       var stringLiteral = new StringLiteral("string", "\"", StringOptions.None);

       var LPAREN = ToTerm("(");
       var RPAREN = ToTerm(")");
       var SEMICO = ToTerm(";");
       var NL = ToTerm("\n");         
       this.Root = program;

       program.Rule = command + Eof;

       keyword.Rule = ToTerm("setlink") | "connect";
       command.Rule = keyword + LPAREN + stringLiteral + RPAREN + SEMICO;  
       commandList.Rule = MakePlusRule(commandList,null , command);
       this.Root = program;

       MarkPunctuation(";");
   }
}
 }
Main.cs

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Irony.Parsing;
 using Irony;
 using System.IO;

 namespace IronyTest
 {
 private static void Main(string[] args)
    {
        Grammar grammar = new LilGrammar();
        var parser = new Parser(grammar);
        string path = @"c:\code\code.txt";


        // Open the file to read from. 
        string readText = File.ReadAllText(path);


        //Returns the root to a parase tree
        //var tree = parser.Parse(readText, path);
        ParseTree parseTree = parser.Parse(readText,path);
        ParseTreeNode root = parseTree.Root;
 }

我认为解决办法是让程序由一系列命令组成,而不仅仅是一个命令

因此,通过以下修改,它似乎可以正确解析。请注意,我使ToTermconnect在关键字.Rule中看起来与setlink一样,并将program.Rule的定义移动到commandList.Rule的定义之后,并将program.Rule更改为引用commandList,而不是command


我只是运行了这个,没有错误。你得到了什么错误状态?顺便说一句,我必须添加一个using System.IO;如果您调试并观察parseTree.Tokens,您将看到令牌的数量是6,因为它停在字母c处。它应该停止在字符上;这是第二个函数调用的结束。谢谢!我能够成功解析n个命令的列表。
keyword.Rule = ToTerm("setlink") | ToTerm("connect");
command.Rule = keyword + LPAREN + stringLiteral + RPAREN + SEMICO;
commandList.Rule = MakePlusRule(commandList, command);
program.Rule = commandList + Eof;
this.Root = program;