Parsing 使用ANTLR手动发出令牌

Parsing 使用ANTLR手动发出令牌,parsing,compiler-construction,antlr,Parsing,Compiler Construction,Antlr,我在ANTLR中手动发出带有lexer规则的令牌时遇到了一些问题。我知道需要使用emit()函数,但似乎明显缺乏这方面的文档。有没有人有一个很好的例子来说明如何做到这一点 ANTLR的书给出了一个很好的例子,说明了如何解析Python的嵌套。例如,如果看到一定数量的空格大于前一行的空格,则发出缩进标记,如果较小,则发出DEDENT标记。不幸的是,这本书忽略了所需的实际语法 编辑:下面是一个我试图解析的示例。这是Markdown的嵌套块引号: before blockquote > tex

我在ANTLR中手动发出带有lexer规则的令牌时遇到了一些问题。我知道需要使用emit()函数,但似乎明显缺乏这方面的文档。有没有人有一个很好的例子来说明如何做到这一点

ANTLR的书给出了一个很好的例子,说明了如何解析Python的嵌套。例如,如果看到一定数量的空格大于前一行的空格,则发出缩进标记,如果较小,则发出DEDENT标记。不幸的是,这本书忽略了所需的实际语法

编辑:下面是一个我试图解析的示例。这是Markdown的嵌套块引号:

before blockquote

> text1
>
> > text2
>
> text3

outside blockquote

现在,到目前为止,我的方法基本上是计算每行的>符号。例如,上面的代码似乎应该发出(大致…)段落开始,CDATA,段落结束,BQUOTE开始,CDATA,BQUOTE开始,CDATA,BQUOTE结束,CDATA,BQUOTE结束,CDATA,BQUOTE结束,段落开始,CDATA,段落结束。这里的难点是最后一个BQUOTE_端,我认为它应该是一个假想的令牌,一旦找到一个非blockquote元素(嵌套级别>=1)

如果您想要发出的令牌不是由lexer规则定义的,那么您需要添加一个令牌部分,如下所示:

tokens
{
    MYFAKETOKEN
}
在您的lexer中,您仍然需要一条规则来告诉lexer何时生成此令牌。一个常见的实例是确定某个对象是整数、范围还是实值

NUMBERS_OR_RANGE
: INT 
        ( { LA(1) == '.' && LA(2) == '.' }? { _ttype = INT; }
    | { LA(1) == '.' || LA(1) == 'e' || LA(1) == 'E' }? { _ttype = REAL; }
    )
| PERIOD 
    ( PERIOD { _ttype = RANGE; }
    INT (( 'e' | 'E' ) ( '-' | '+' )? INT )? { _ttype = REAL; }
)
;
在这里你可以看到我们匹配一个INT,然后向前看,如果我们找到一个双周期,那么我们知道INT实际上是一个INT,而不是一个实的。在本例中,我们将变量_ttype设置为INT。如果我们找到一个句点,然后找到一个“e”,我们就知道它是实数

第二种情况是我们匹配一个句点,我们知道如果下一个字符是句点,那么我们就得到了一个范围,否则我们就得到了一个实数


如果合适的话,我们可以使用上面定义的
MYFAKETOKEN
类型分配给_t类型。

好的,我做了一些研究,发现:


我不认为ANTLR真的是为这类任务而设置的,而试图竭尽全力去完成这类任务是不值得的。

Scott,你能举一个例子说明你试图解析什么吗?你在问题中提到了Python,但实际上没有说你在使用什么语言。我举了一个C++的例子,谢谢,这和我要找的东西非常接近…根据要求,我用一个更具体的例子更新了这个问题。如果您有任何见解,将不胜感激!