OMeta下划线和点

wei*_*gyn 6 c# ometa

您好我需要修改以下OMeta PEG:

using OMetaSharp;
using System.Collections;
using System.Text;

ometa SExpression.GeneratedCode.SExpressionParser : Parser {
    SExpression = Spaces Atom:a Spaces -> { a }
                | Spaces List:l Spaces -> { l.As<SExprList>() },


    EscapeChar  = '\\' Character:c          -> { c },

    Atom        = String:s -> { new SExprAtomString(s.ToString()) }
                | Number:n -> { new SExprAtomNumber(n.ToString()) }
                | Symbol:sy -> { new SExprAtomSymbol(sy.ToString()) },

    Symbol      = FirstAndRest("Letter", "LetterOrDigit") | '+' | '-' | '*' | '/' | '^',

    String      = '"' (EscapeChar | ~'"' Character)*:s '"'  -> { s },

    Number      = Digit+,

    List        = '(' SExpression*:xs ')' -> { new SExprList(xs.ToIEnumerable<ISExpression>()) }
}
Run Code Online (Sandbox Code Playgroud)

支持包括下划线和点字符的符号.Numbers中也应该支持点.

我尝试使用以下产品修改Number规则(取自原始的Ometa# site),但在生成SExpression解析器时最终会出现运行时错误:

Number = Number:n Digit:D           -> (n * 10 + d)
         | Digit,
Run Code Online (Sandbox Code Playgroud)

这似乎也不起作用:

Number      = Digit+
            | Digit+ '.' Digit+,
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我能够生成解析器,但是当我尝试解析类似的东西时,我得到了一个OMeta异常0.25.

我还写了这些规则以允许解析下划线(和点)丰富的符号,但它也不起作用:

Atom        = Sub:s                                     -> { new SExprAtomString(s.ToString()) }
            | Number:n                                  -> { new SExprAtomNumber(n.ToString()) }
            | Symbol:sy                                 -> { new SExprAtomSymbol(sy.ToString()) },

Sub         = String
            | String '_' String
            | String '.' String,
Run Code Online (Sandbox Code Playgroud)

我试图解析的表达式如下:

(fp_text value V23105 (at -2 0 180) (layer FSilkS) hide
    (effects (font (size 1 1) (thickness 0.25)))
)
Run Code Online (Sandbox Code Playgroud)

解析它的异常总是这样的:

在此输入图像描述

没有堆栈跟踪:-(.