C# 将左括号之后的所有内容解释为字符串,直到下一个右括号

C# 将左括号之后的所有内容解释为字符串,直到下一个右括号,c#,parsing,antlr4,C#,Parsing,Antlr4,[解决方案] 在Edit3下面的底部 我目前正在开发一种新的语法(根据某些我无法更改的需求),以下需求提出了一个问题,我目前无法解决。我将Antlr4与C#目标一起使用 语法如下: print [blabla ] 因此,括号内的所有内容都被视为字符串。这也是: print [3 + 2] 将打印 3 + 2 现在我有了lexer规则,它显然将3作为一个整数匹配。那么,我如何创建一个解析器规则来解析任何东西,直到找到一个']'为止?我目前有以下产品: control : | Print e

[解决方案] 在Edit3下面的底部

我目前正在开发一种新的语法(根据某些我无法更改的需求),以下需求提出了一个问题,我目前无法解决。我将Antlr4与C#目标一起使用

语法如下:

print [blabla ]
因此,括号内的所有内容都被视为字符串。这也是:

print [3 + 2]
将打印

3 + 2
现在我有了lexer规则,它显然将3作为一个整数匹配。那么,我如何创建一个解析器规则来解析任何东西,直到找到一个']'为止?我目前有以下产品:

control
: 
| Print expr
| Print LeftBracket printArg RightBracket
    ;
我面临的问题是,左括号并不总是以字符串开头。有时(如在while)条件也在括号内。我曾想过接受每一条Lexer规则,直到到达右括号,然后在运行时使用生成的解析树生成字符串,但在我看来,这很烦人,我需要在以后插入空格,这将很困难

如果你需要我的语法的更多部分,请在评论中提问,我会为你提供更多细节 问候

卢卡斯

编辑:有关我的语法的更多信息: 以下产品使用括号:

Print LeftBracket printArg RightBracket
Repeat IntegerConstant LeftBracket body RightBracket
While LeftBracket expr RightBracket LeftBracket body RightBracket
If expr LeftBracket body RightBracket LeftBracket body RightBracket
SetPos LeftBracket IntegerConstant IntegerConstant RightBracket
编辑2: 因此,我尝试使用这些模式,但从它们返回时遇到了问题。以下是关于模式的代码行:

mode printMode;
WhitespacePrint
    :   [ \t]+
        -> skip
    ;
LeftBracketPrint : '[' -> popMode, pushMode(stringMode);
NotLeftBracket : ~'[' -> popMode;

mode stringMode;
String : ~']'+;
RightBracketPrint: ']' -> popMode;
我在Print lexer规则中添加了一个pushMode(printMode)(匹配关键字) 现在,解析print[1+2]将创建一个标记,其中包含括号内的整个字符串。现在,当我使用print1+2(应该是输出3)时,我得到一个不可行的替代ar输入“print1”异常,因为“1”有一个NotLeftBracket类型。如何在不消耗输入的情况下切换模式

编辑3: 接下来,我尝试使用一些内联代码和lookahead,最终解决了我的问题:

mode printMode;
LeftBracketPrint : [ \t]+ '[' -> popMode, pushMode(stringMode);
WhitespacePrint
    :   [ \t]+ {_input.La(1) != '['}?
        -> skip, popMode
    ;

mode stringMode;
String : ~']'+;
RightBracketPrint: ']' -> popMode;

首先,我将把括号内的所有内容都视为lexer中的
BracketLiteral

LeftBracket : '[' -> pushMode(BracketLiteralMode);

mode BracketLiteralMode;

  BracketLiteral : ~']'+;
  RightBracket : ']' -> popMode;

在决定如何处理特殊情况之前,我将列举语法中出现
BracketLiteral
规则异常的所有可能性。如果您可以添加这些详细信息,我将能够就如何处理这些情况提出一些建议。

如果我正确理解在解释括号内的内容时存在双重性,则它是字符串或表达式,具体取决于上下文(对于打印,它是字符串)

2可能的场景:

  • 在lexer级别,点击左括号时检查上下文,然后进入字符串模式或常规模式(即表达式)
  • 此外,在lexer级别,每当您点击左括号并用以下文本填充它时,创建一个缓冲区,使用右括号值(通常它是无用的)作为传递逐字字符串的工具
我认为第一种方法更容易,因为在第二种方法中,您必须为print的内容编写解析规则,而这可能是不可解析的:

print [ a ++++ 2 ]

添加了有关我的语法的更多信息。我感谢你难以置信的帮助!我在想这是否可行:当我看到一个打印时,我会进入一个打印模式,除了“[”(和corse whitespaces=的)之外的所有东西都会离开这个模式,当我点击“[”时,我会用你的代码将所有东西解析为字符串。这是正确的方法吗?