当期望返回5个令牌时,ANTLR3词法分析器返回一个令牌

时间:2014-09-10 23:05:47

标签: antlr antlr3 lexer

您好我正在尝试构建一个简单的词法分析器来标记以';'开头的行字符。

这是我的词法分析器语法:

lexer grammar TestLex;

options {
  language = Java;
  filter = true;
}

@header {
  package com.ualberta.slmyers.cmput415.assign1;
}

IR              :   LINE+           
                ;

LINE            :   SEMICOLON (~NEWLINE)* NEWLINE
                ;

SEMICOLON       : ';'                   
                ;
NEWLINE         : '\n'              
                ;
WS              : (' ' | '\t')+ 
                  {$channel = HIDDEN;}
                ;

这是我的java类来运行我的词法分析器:

package com.ualberta.slmyers.cmput415.assign1;

import java.io.IOException;

import org.antlr.runtime.*;

public class Test {

public static void main(String[] args) throws RecognitionException,
        IOException {

    // create an instance of the lexer
    TestLex lexer = new TestLex(
            new ANTLRFileStream(
                    "/home/linux/workspace/Cmput415Assign1/src/com/ualberta/slmyers/cmput415/assign1/test3.s"));

    // wrap a token-stream around the lexer
    CommonTokenStream tokens = new CommonTokenStream(lexer);

    // when using ANTLR v3.3 or v3.4, un-comment the next line:
    tokens.fill();

    // traverse the tokens and print them to see if the correct tokens are
    // created
    int n = 1;
    for (Object o : tokens.getTokens()) {
        CommonToken token = (CommonToken) o;
        System.out.println("token(" + n + ") = "
                + token.getText().replace("\n", "\\n"));
        n++;
    }
}

}

致:http://bkiers.blogspot.ca/2011/03/2-introduction-to-antlr.html 对于上面改编的代码。

这是我的测试文件:

; token 1
; token 2
; token 3
; token 4

注意最后一个'4'后面有一个换行符。

这是我的输出:

token(1) = ; token 1\n; token 2\n; token 3\n; token 4\n
token(2) = <EOF>

我期待这是我的输出:

token(1) = ; token 1\n
token(2) = ; token 2\n
token(3) = ; token 3\n
token(4) = ; token 4\n
token(5) = <EOF>

1 个答案:

答案 0 :(得分:1)

好的,我发现问题出在这一行:

IR          :   LINE+           
            ;

返回了由多行组成的一个令牌。