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
错误应按以下顺序显示:
- 用语法犯错误
- 通过“智能”检查类型引发错误
- 用语法犯错误
- 用语法犯错误
- 用语法犯错误
请帮助您需要更好地理解此处的语言处理过程。它不仅仅包括解析(简单地说,这是一种与语言定义(语法)相比确定输入有效性的方法)。解析为您提供了一个以某种方式描述输入的结构(通常是解析树或语法树)。它对单个标记的含义一无所知。确定这一点通常是另一个步骤的一部分:语义阶段 在这样的语义阶段,您从解析运行中获取输出,并将含义应用于相关标记,例如找到了哪种类型(水果、蔬菜)。有了这些知识,您就可以开始对函数进行类型验证了
这种分离让您清楚地认识到,您不能也不应该在解析(语法)步骤中处理语义。您需要更好地理解这里的语言处理过程。它不仅仅包括解析(简单地说,这是一种与语言定义(语法)相比确定输入有效性的方法)。解析为您提供了一个以某种方式描述输入的结构(通常是解析树或语法树)。它对单个标记的含义一无所知。确定这一点通常是另一个步骤的一部分:语义阶段 在这样的语义阶段,您从解析运行中获取输出,并将含义应用于相关标记,例如找到了哪种类型(水果、蔬菜)。有了这些知识,您就可以开始对函数进行类型验证了
这种分离很有希望让您明白,您不能也不应该在解析(语法)步骤中处理语义。我同意您的观点,不要将语法解析和智能验证(如检查对象类型)混用在一起。如果这是最佳实践,我应该接受它。但这并不能解决我的问题。我同意你的观点,不要将语法解析和智能验证(比如检查对象类型)混为一谈。如果这是最佳实践,我应该接受它。然而,这并不能解决我的问题。