Lexer / Parser用于由方法调用组成的简单DSL

时间:2015-07-28 14:50:49

标签: c# parsing compiler-construction dsl lexer

我正在寻找为我们使用内部工具的简单DSL创建词法分析器和解析器。将会有一些内置符号(这是正确的术语吗?),它们需要1到10个参数。例如:

foo(bar1;bar2)

在运行时也会添加符号,参数总是为零。例如:

testy1()

这些将串在一起并从CSV文件中读取。装配线就像:

foo(bar1:bar2)testy1()

我很难在线查找资源,这很容易解释lexing和解析这些函数调用。有人能指出我的方向,或提供建议吗?

1 个答案:

答案 0 :(得分:0)

我已经用PegJS编写了一个小解析器,它能够解析函数调用中的简单表达式。聚乙二醇避免歧义,它们可以正常工作。

Start
  = Expr

/* Expressions */

Expr
  = FuncCall
  / Literal

RestExpr
  = _ ( "," / ":" ) _ e:Expr {
    return e;
  }

/* Function call */

FuncCall
  = func:Ident _ "(" _ x:Expr? xs:RestExpr* _ ")" {
    return {
      type: "FuncCall",
      func: func.value,
      params: x ? [x].concat(xs) : []
    };
  }

/* Literals */

Literal
  = Number
  / Ident

Number
  = val:[0-9]+ {
    return {
      type: "Number",
      value: parseInt(val.join(""))
    };
  }

/* Identifier */

Ident
  = x:IdentStart xs:IdentRest* {
  return {
    type: "Ident",
    value: [x].concat(xs).join("")
  };
}

IdentStart
  = [a-z_]i

IdentRest
  = [a-z0-9_]i
_
  = [ \s\t\r\n]*

您可以在此处测试解析器:http://pegjs.org/online

输入示例为foo(1, bar(2), baz(3)),其中输出为:

{
   "type": "FuncCall",
   "func": "foo",
   "params": [
      {
         "type": "Number",
         "value": 1
      },
      {
         "type": "FuncCall",
         "func": "bar",
         "params": [
            {
               "type": "Number",
               "value": 2
            }
         ]
      },
      {
         "type": "FuncCall",
         "func": "baz",
         "params": [
            {
               "type": "Number",
               "value": 3
            }
         ]
      }
   ]
}

这显然不是最佳方法,但我相信peg-sharp可以很好地使用C#:https://code.google.com/p/peg-sharp/