我想创建一个具有友好功能名称的MiniLang
这是我的示例脚本和预期声明
// actual // expected
set a = true; // 'set a' -> IDs // 'set' -> Set, 'a' -> IDS
Set name ('hello'); // 'Set name' -> IDs // 'Set name' -> IDs
set b = my friendly variable; // 'set b' -> IDs // 'set' -> Set, 'b' -> IDS
set my variable = 10; // 'set my variable' -> IDs // 'set' -> Set, 'my variable' -> IDs
Calculate sum (1, 2, 4); // 'Calculate sum' -> IDs // 'Calculate sum' -> IDs
我想在ID(具有多个单词的标识符)之前匹配一些保留的关键字。但ANTLR4仅匹配ID。我尝试在ID之前定义关键字但不影响。
如何在ID
之前匹配语句关键字的规则谢谢!
这是我的语法
grammar MiniLang;
document
: (stmt NL*)+ EOF
;
stmt
: Set Space+ IDs Space* '=' Space* expr Space* ';' # SetStatement
| IDs Space* '(' Space* (expr (Space*(',' expr))*)? Space* ')' Space* ';' # FunctionCall
;
expr
: atom
;
atom
: IDs
| Number
| String
;
Set
: 'set'
;
Space
: ' '
;
Number
: [0-9]+
;
ID
: [a-zA-Z][a-zA-Z0-9]*
;
IDs
: ID (Space ID)*
;
String
: ['] (~['\r\n\\] | EscapeSequence)* [']
;
EscapeSequence
: '\\' [']
;
NL
: [\r\n]
;
答案 0 :(得分:1)
词法分析器尝试尽可能匹配。因此,您需要将IDs
规则更改为解析器规则:
ids
: ID+
;
Space
: [ \t] -> skip
;
或者如果你要保留空格:
ids
: ID (Space ID)*
;