C# ANTLR4添加了额外的解析验证

C# ANTLR4添加了额外的解析验证,c#,parsing,antlr,C#,Parsing,Antlr,比方说,我有一个文本文件: Vegetable carrot, Vegetable salad, Fruit orange, Fruit apple, PRINT GetFruitCalories(orange), PRINT GetFruitCalories(salad) ANTLR可以收集所有这些代币 比如说,我们想在GetFruitCarries方法中禁止蔬菜种类 此方法应仅使用水果args Antll可以检查我们是否有数字、逗号、点、(,)、新行。。。。(语法)但是“智能”类型检查

比方说,我有一个文本文件:

Vegetable carrot,
Vegetable salad,
Fruit orange,
Fruit apple,

PRINT GetFruitCalories(orange),
PRINT GetFruitCalories(salad)
ANTLR可以收集所有这些代币

  • 比如说,我们想在GetFruitCarries方法中禁止蔬菜种类
  • 此方法应仅使用水果args
  • Antll可以检查我们是否有数字、逗号、点、(,)、新行。。。。(语法)但是“智能”类型检查呢
  • 我们可以根据前缀“水果”和“蔬菜”、沙拉和橙子的类型进行检查吗
  • 我想在执行GetFruitCarries(沙拉)时,由解析器引发一个错误
  • 我可以让访问者检查类型,但错误顺序为:
  • 第一个语法分析器检查语法
  • 我的客户检查我的访客中的水果类型
  • 我想把它结合起来,一些有错误的代码:

    ABCBACBAC_INVALID_TEXT1 //raise an error by grammar
    Vegetable salad,
    PRINT GetFruitCalories(salad), //raise an error by "smart" checking type
    ABCBACBAC_INVALID_TEXT2 //raise an error by grammar
    
    错误应按以下顺序显示:

    • 用语法犯错误
    • 通过“智能”检查类型引发错误
    • 用语法犯错误
    但如果我访问我的访问者,语法分析器中的错误将首先被执行,我将只看到:

    • 用语法犯错误
    • 用语法犯错误
    由于解析器的原因,将阻止打印GetFruitCarries(沙拉)

    我使用C#,在收集了所有水果和蔬菜之后,最好有一个活动来检查这些类型。对我来说最重要的是错误序列顺序。也许,我想在解析器层上实现它。可能吗?有定制吗?通常我只调用方法“parse”。也许在语法中引入c#代码会有所帮助——我从未尝试过。关于“卡路里访客”方法的活动也很不错


    请帮助

    您需要更好地理解此处的语言处理过程。它不仅仅包括解析(简单地说,这是一种与语言定义(语法)相比确定输入有效性的方法)。解析为您提供了一个以某种方式描述输入的结构(通常是解析树或语法树)。它对单个标记的含义一无所知。确定这一点通常是另一个步骤的一部分:语义阶段

    在这样的语义阶段,您从解析运行中获取输出,并将含义应用于相关标记,例如找到了哪种类型(水果、蔬菜)。有了这些知识,您就可以开始对函数进行类型验证了


    这种分离让您清楚地认识到,您不能也不应该在解析(语法)步骤中处理语义。

    您需要更好地理解这里的语言处理过程。它不仅仅包括解析(简单地说,这是一种与语言定义(语法)相比确定输入有效性的方法)。解析为您提供了一个以某种方式描述输入的结构(通常是解析树或语法树)。它对单个标记的含义一无所知。确定这一点通常是另一个步骤的一部分:语义阶段

    在这样的语义阶段,您从解析运行中获取输出,并将含义应用于相关标记,例如找到了哪种类型(水果、蔬菜)。有了这些知识,您就可以开始对函数进行类型验证了


    这种分离很有希望让您明白,您不能也不应该在解析(语法)步骤中处理语义。

    我同意您的观点,不要将语法解析和智能验证(如检查对象类型)混用在一起。如果这是最佳实践,我应该接受它。但这并不能解决我的问题。我同意你的观点,不要将语法解析和智能验证(比如检查对象类型)混为一谈。如果这是最佳实践,我应该接受它。然而,这并不能解决我的问题。