解析自定义语言语法

时间:2017-06-09 23:08:32

标签: vb.net parsing syntax

我正在开发一种服务器端脚本语言,我打算在我的私人服务器上使用它。它类似于PHP,我知道我可以轻松使用PHP,但我只是为了好玩而做一些编程。

我语言中基本命令的语法如下:

command_name "parameter1" : "parameter2" : "parameter3"

但是当我想要为参数加入值时,它也可能是这样的:

command_name "parameter1" : "param" & "eter2" : "par" & "amet" & "er3"

如何解析具有这些属性的对象,如上所示的字符串(它将是完美的类型,没有语法错误)

  • 自定义类“请求”
  • 属性“Command”as String,应该是“command_name”部分
  • 属性“Parameters”as String(),应该是Parameter对象的数组
  • 共享函数FromString(s As String)作为Request,这应该接受上面语言中的字符串并将其解析为Request对象
  • 自定义类“参数”
  • 属性“Segments”为String(),例如“para”,“mete”和“r3”
  • Sub New(ParamArray s as String()),这是从代码生成的方式

它应该在VB.NET中完成,我是一个中等程度的程序员,所以即使你只是想知道如何攻击它,那么请与我分享。我很难解析这样的复杂数据,所以我需要很多帮助。非常感谢!

2 个答案:

答案 0 :(得分:1)

这是另一种更简单的方法。

Module Module1

    Sub Main()
        Dim inputs As String() = {"command_name ""parameter1"" : ""parameter2"" : ""parameter3""", "command_name ""parameter1"" : ""param"" & ""eter2"" : ""par"" & ""amet"" & ""er3"""}

        For Each _input As String In inputs
            Dim commandStr As String = _input.Substring(0, _input.IndexOf(" ")).Trim()
            Dim parameters As String = _input.Substring(_input.IndexOf(" ")).Trim()
            Dim parametersA As String() = parameters.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(Function(x) x.Trim()).ToArray()
            Dim parametersB As String()() = parametersA.Select(Function(x) x.Split("&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(Function(y) y.Trim(" """.ToCharArray())).ToArray()).ToArray()

            Dim newCommand As New Command() With {.name = commandStr, .parameters = parametersB.Select(Function(x) New Parameter(x)).ToArray()}
            Command.commands.Add(newCommand)
        Next (_input)

        Dim z = Command.commands

    End Sub

End Module

Public Class Command
    Public Shared commands As New List(Of Command)

    Public name As String
    Public parameters As Parameter()
End Class
Public Class Parameter
    Sub New()

    End Sub
    Sub New(names As String())
        Me.names = names
    End Sub
    Public names As String()
End Class

答案 1 :(得分:0)

我自己想出来了

Module Module1

Sub Main()
    Dim r As Request = Request.Parse(Console.ReadLine())
    Console.WriteLine("The type of request is " & r.Name)
    For Each p As Parameter In r.Parameters
        Console.WriteLine("All segments inside of parameter " & r.Parameters.IndexOf(p).ToString)
        For Each s As String In p.Segments
            Console.WriteLine("    Segment " & p.Segments.IndexOf(s).ToString & " is " & s)
        Next
    Next
    Main()
End Sub

Public Class Request
    Public Name As String
    Public Parameters As New List(Of Parameter)
    Public Shared Function Parse(line As String)
        Dim r As New Request
        r.Name = line.Split(" ")(0)
        Dim u As String = line.Substring(line.IndexOf(" "), line.Length - line.IndexOf(" "))
        Dim p As String() = u.Split(":")
        For Each n As String In p
            Dim b As String() = n.Split("&")
            Dim e As New List(Of String)
            For Each m As String In b
                Dim i As Integer = 0
                Do Until i > m.Length - 1
                    If m(i) = ControlChars.Quote Then
                        Dim s As String = ""
                        i += 1
                        Do Until i > m.Length - 1 Or m(i) = ControlChars.Quote
                            s &= m(i)
                            i += 1
                        Loop
                        e.Add(s)
                    End If
                    i += 1
                Loop
            Next
            r.Parameters.Add(New Parameter(e.ToArray))
        Next
        Return r
    End Function
End Class

Public Class Parameter
    Public Segments As New List(Of String)
    Public Sub New(ParamArray s As String())
        Segments = s.ToList
    End Sub
End Class
End Module
相关问题