regex ANTLR4:解析数字和字符串中的减号和点等符号时出现问题

ddrv8njm  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(92)

我正在使用ANTLR4并尝试解析字符串和数字中的.“"。我希望能够解析以下两个语句,但只能成功解析其中一个,而不能同时解析两个:

str = "sentence. more.";
num = 5.5;

字符串
我正在使用以下语法文件:

grammar TestGrammar;

// Parser rules
rule : statement*;

statement : assignmentStatement;

assignmentStatement : identifier '=' numberLiteral ';' 
                    | identifier '=' stringLiteral ';'
                    ;

numberLiteral : MINUS? NUM* DOT? NUM+;
stringLiteral : '"' string '"';

string : (SYMBOL | CHAR | NUM)+;
identifier : UNDERSCORE? (CHAR | NUM)+;

// Lexer rules

WS : (' ' | '\t' | '\r' | '\n')+ -> skip;

CHAR : [a-zA-Z];
NUM : [0-9];
SYMBOL : [<>#=&|!(){}.\-:;];

MINUS : '-';
UNDERSCORE : '_';
DOT : '.';


DOT和SYMBOL词法分析器规则之间存在重叠。目前,它能够解析字符串,但不能解析数字。如果我更改规则顺序,使DOT在SYMBOL之前,它就可以解析数字,但不能解析字符串。
我试过直接用“.”吗?在numberLiteral规则中,并移除DOT规则,这仍然会在比对字串时造成问题。我还尝试过将SYMBOL规则更改为如下所示的内容:

SYMBOL : [<>#=&|!(){}DOT\-:;];


可能我的语法错误,但无法正确解析字符串。如何更改我的语法文件,使其能够成功解析这两种语法?我也有类似的问题与减号。谢谢你,谢谢

trnvg8h3

trnvg8h31#

您需要创建Number和String Literals作为标记(如果您想命名子部分,可以使用fragment,但要理解,您只能获得STRINGNUMBER标记。不存在为片段匹配生成的令牌,并且令牌不具有作为组件的令牌,它们是解析树上的叶节点。
试试这个:

grammar TestGrammar
    ;

// Parser rules
rule: statement*;

statement: assignmentStatement;

assignmentStatement
    : IDENTIFIER '=' NUMBER ';'
    | IDENTIFIER '=' STRING ';'
    ;

NUMBER: MINUS? NUM* DOT? NUM+;
STRING: '"' (SYMBOL | CHAR | NUM | SPACE)+ '"';

//string: (SYMBOL | CHAR | NUM)+;

// Lexer rules
IDENTIFIER: UNDERSCORE? (CHAR | NUM)+;

fragment CHAR:   [a-zA-Z];
fragment NUM:    [0-9];
fragment SYMBOL: [<>#=&|!(){}.\-:;];
fragment SPACE: ' ';

fragment MINUS:      '-';
fragment UNDERSCORE: '_';
fragment DOT:        '.';

WS: [ \t\r\n]+ -> skip;

字符串

flvtvl50

flvtvl502#

数字是离散的,因此适合在词法分析器中匹配。未在数字中使用的Dot s将作为DOT s发出。

DOUBLE  : [+-]? DecimalFloatingPoint ;
DOT     : Dot ;

fragment DecimalFloatingPoint
    : DecDigits Dot DecDigits? ExponentPart? FloatSuffix?
    | Dot DecDigits ExponentPart? FloatSuffix?
    | DecDigits ExponentPart FloatSuffix?
    | DecDigits FloatSuffix
    ;

fragment ExponentPart  : [eE] [+-]? DecDigits ;
fragment FloatSuffix   : [fFdD] ;
fragment DecDigits     : [0-9]+ ;
fragment Dot           : '.' ;

字符串
PS:Antlr Grammars Repo是一个寻找例子的好地方。

相关问题