【发布时间】:2019-02-25 19:19:40
【问题描述】:
我正在尝试使用 JFlex 和 Jacc 在 Java 中创建一个简单的解析器。为了测试,我编写了一个简单的词法分析器组合来识别字符串和数字。我设法连接了词法分析器和解析器,但无法处理从 System.io 发送的换行符(ASCII 10)。
这里是 lexer.flex
import java.io.*;
%%
%class Lexer
%implements ParserTokens
%function yylex
%int
%{
private int token;
private String semantic;
public int getToken()
{
return token;
}
public String getSemantic()
{
return semantic;
}
public int nextToken()
{
try
{
token = yylex();
}
catch (java.io.IOException e)
{
System.out.println("IO exception occured:\n" + e);
}
return token;
}
%}
ID = [a-zA-Z_][a-zA-Z_0-9]*
NUMBER = [0-9]+
SPACE = [ \t]
NL = [\n] | [\r] | [\n\r]
%%
{ID} { semantic = yytext(); return ID; }
{NUMBER} { semantic = yytext(); return NUM; }
{SPACE} { }
{NL} { System.out.println("Kill the bugger!"); }
<<EOF>> { }
Parser.jacc:
%{
import java.io.*;
%}
%class Parser
%interface ParserTokens
%semantic String
%token <String> ID
%token <String> NUM
%token <String> SPACE
%type <String> inp
%%
inp : inp sim { System.out.println($2); }
| sim { System.out.println($1); }
;
sim : ID
| NUM
;
%%
private Lexer lexer;
public Parser(Reader reader)
{
lexer = new Lexer(reader);
}
public void yyerror(String error)
{
System.err.println("Error: " + error);
}
public static void main(String args[]) throws IOException
{
Parser parser = new Parser(
new InputStreamReader(System.in));
parser.lexer.nextToken();
parser.parse();
}
一个示例终端会话:
[johnny@test jacc]$ java Parser
a b c
a
b
Kill the bugger!
1 2 3 4
c
1
2
3
Kill the bugger!
所以当我输入“a b c”时,解析器会打印“a”、“b”,然后是可怜的 ASCII 10。接下来我输入“1 2 3 4”,然后解析器才会打印“c”等。我在Linux / Java 9。
【问题讨论】:
-
您希望在输入中遇到换行符时会发生什么?
-
我有点希望在 before 换行符 before 换行符之前输入的所有标记。
标签: java io newline yacc jflex