Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String Antlr4将文本作为字符串而不是单个字符从lexer传递回解析器_String_Text_Antlr4_Pass Through - Fatal编程技术网

String Antlr4将文本作为字符串而不是单个字符从lexer传递回解析器

String Antlr4将文本作为字符串而不是单个字符从lexer传递回解析器,string,text,antlr4,pass-through,String,Text,Antlr4,Pass Through,我有一个语法,需要处理输入流中任意点以“{*开始,以*}”结束的注释。它还需要处理以“{”开头,后跟“$”或“$”和标识符,以“}”结尾的模板标记,并将其他所有内容作为文本传递 实现这一点的唯一方法似乎是将任何不是注释或标记的东西作为单个字符传递回解析器,并让解析器构建字符串。这是非常低效的,因为解析器必须为它接收到的每个字符构建一个节点,然后我必须遍历节点并从中构建一个字符串。如果lexer可以将文本作为一个大字符串返回,我会简单得多,速度会快得多 在I7上,在90K文本文件上以32位C程序的

我有一个语法,需要处理输入流中任意点以“{*开始,以*}”结束的注释。它还需要处理以“{”开头,后跟“$”或“$”和标识符,以“}”结尾的模板标记,并将其他所有内容作为文本传递

实现这一点的唯一方法似乎是将任何不是注释或标记的东西作为单个字符传递回解析器,并让解析器构建字符串。这是非常低效的,因为解析器必须为它接收到的每个字符构建一个节点,然后我必须遍历节点并从中构建一个字符串。如果lexer可以将文本作为一个大字符串返回,我会简单得多,速度会快得多

在I7上,在90K文本文件上以32位C程序的形式运行该程序,没有标记或注释,只有文本,大约需要15分钟,它才会因内存异常而崩溃

语法基本上是

Parser:
text: ANY_CHAR+;

Lexer:

COMMENT: '{*' .*? '*}' -> skip;

... Token Definitions .....

ANY_CHAR: [ -~];
如果我试图在lexer中累积文本,它会吞噬所有内容,并且无法识别注释或标记,因为类似于任何_CHAR+的内容会匹配所有内容,并在字符串中返回注释和模板标记


有人知道解决这个问题的方法吗?目前看来我必须手工编写一个lexer。

是的,这是效率低下的,但也不是这样做的方法。解决方案完全在lexer中

我知道您想要检测注释、模板标记和文本。为此,您应该使用lexer模式。每次你点击{进入某种lexer模式,比如MODE1,在那里你只能检测到*或$,或者因为我不明白你所说的“{”后面跟着“$”或标识符,还有别的什么意思,取决于你点击的是什么,进入MODE2或MODE3。在那之后,MODE2或MODE3等待}'并切换回默认模式。当然,在这两种模式之间可能会有更多的模式,这取决于您想做什么,但对于我刚才所写的:

在模式1中,您可以确定现在是否检测到注释或模板标记。此模式和所有其他模式中只有两个标记。如果它转到模式2,如果其他任何模式转到模式3 MODE2这里只有一个您需要的标记,即COMMENT,但是您还需要检测“*}”或“}”,这取决于您想要如何处理它 MODE3与MODE2类似-检测您需要的内容,并拥有一个将切换回默认模式的令牌。
我最终将所有文本推送到一个文本通道中,然后在解析器中将其从通道中拉出。基本上这就是我已经在做的事情。我不明白的是如何让文本作为一个长字符串而不是单个字符返回到解析器。我发现的唯一方法是将它推送到文本通道。如果你想让解析器得到一个长字符串,那么你应该创建一个表示它的lexer规则,这与其他东西无关。文本:任意字符+;但是请注意,在你的任意字符中也有空格。我发现,你必须使用~[SomeChar]+才能让它正常工作。你知道:~[s]~[t]~[r]~[I]~[n]~[g]是~'string'的等价物还是~[string]?