Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Antlr4未检测到1到8之间的整数,lexer问题_C#_Antlr4 - Fatal编程技术网

C# Antlr4未检测到1到8之间的整数,lexer问题

C# Antlr4未检测到1到8之间的整数,lexer问题,c#,antlr4,C#,Antlr4,antlr 4 c#存在一个无法识别整数标记的问题。它适用于数字1和9,但不适用于1到9 我试着重建语法,但不起作用:( 这是我的语法: grammar simplerlang; // Parser program : statement+ ; statement : let | print ; let : VAR '=' INT ; print : 'print' (INT | VAR) ; // Lexer VAR : [a-z]+ ; INT : [0–9]

antlr 4 c#存在一个无法识别整数标记的问题。它适用于数字1和9,但不适用于1到9

我试着重建语法,但不起作用:(

这是我的语法:

grammar simplerlang;

// Parser

program   : statement+ ;
statement : let | print ;
let       : VAR '=' INT ;
print     : 'print' (INT | VAR) ;

// Lexer

VAR : [a-z]+ ;
INT : [0–9]+ ;
WS  : [ \n\t]+ -> skip;
这是我的c代码:

使用系统;
使用System.Collections.Generic;
使用Antlr4.Runtime;
使用Antlr4.Runtime.Tree;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间超级简单
{
班级计划
{
静态字典变量映射=新字典();
静态void Main(字符串[]参数)
{
while(true)
{
控制台。写(“>”;
字符串_in=Console.ReadLine();
AntlInputStream输入=新的AntlInputStream(_in);
SimpleLangleXer lexer=新的SimpleLangleXer(输入);
CommonTokenStream令牌=新的CommonTokenStream(lexer);
SimpleLangParser解析器=新的SimpleLangParser(令牌);
IParseTree树=parser.statement();
ParseTreeWalker=新的ParseTreeWalker();
Walk(新的simplerlangCustomListener(),树);
}
}
类SimpleLangCustomListener:SimpleLangBaseListener
{
公共覆盖无效ExitPrint(SimpleLangParser.PrintContext ctx)
{
如果(ctx.INT()!=null)
{
Console.WriteLine(ctx.INT().GetText());
}
else if(ctx.VAR()!=null)
{
WriteLine(variableMap[ctx.VAR().GetText()]);
}
}
public override void ExitLet(simplelangparser.LetContext ctx)
{
variableMap.Add(ctx.VAR().GetText(),
int.Parse(ctx.int().GetText());
}
}
}
}
输入:打印1

输出: 第1行:6“1”处的令牌识别错误 第1行:7在“”处缺少{VAR,INT}

输入:打印0 输出:0

输入:打印9 输出:9

VAR : [a-z]+ ;
INT : [0–9]+ ;
如果仔细观察这两行,您会注意到0和9之间的破折号比a和z之间的破折号长。这意味着这不是常规破折号,而是Unicode破折号(或类似的东西)

因此,ANTLR不将其识别为范围,而是将其识别为匹配0、9或emdash的字符类

如果仔细观察这两行,您会注意到0和9之间的破折号比a和z之间的破折号长。这意味着这不是常规破折号,而是Unicode破折号(或类似的东西)

因此,ANTLR不将其识别为范围,而是将其识别为匹配0、9或emdash的字符类

VAR : [a-z]+ ;
INT : [0–9]+ ;