2015-05-13 3 views
0

W e необходимо разобрать правило, которое может включать в себя инструкцию для случая переключения.Regex не может соответствовать шаблону корпуса коммутатора

Как мы рассмотрели использовать Groovy для реализации этого парсер внутри Java кода, я написал код, приведенный ниже в Groovy:

1. class RuleParser { 
2. String functionRegex = /(frml[0-9]*)((\s*@[a-zA-Z0-9_]*\s*)?(,\s*@[a-zA-Z0-9_]*\s*)*)/ 
3. String variableRegex = /@[a-zA-Z0-9_]*/ 
4. String numberRegex = /\s+[0-9]+/ 
5. String switchRegex = /switch(\s*1\s*)((\s*|\n)case)+((\s*|\n)default)?/ 
6. String caseRegex = /case\s*1\s*:\s*1/ 
7. String defaultRegex = /default\s*:\s*1/ 
8. String conditionRegex = /1(>=|<=|>|<|==|!=)1/ 

9. testRule(String rule){ 
10.  try { 
11.   rule.eachMatch(numberRegex){ match-> 
12.    rule=rule.replaceAll(match, ' 1'); 
13.   } 
14.   rule.eachMatch(functionRegex){ match-> 
15.    rule=rule.replaceAll(match, '1'); 
16.   } 
17.   rule.eachMatch(variableRegex){ match-> 
18.    rule=rule.replaceAll(match, '1'); 
19.   } 
20.   rule.eachMatch(defaultRegex){ match-> 
21.    rule=rule.replaceAll(match, 'default'); 
22.   } 
23.   rule.eachMatch(caseRegex){ match-> 
24.    rule=rule.replaceAll(match, 'case'); 
25.   } 
26.   rule.eachMatch(switchRegex){ match-> 
27.    rule=rule.replaceAll(match, '1'); 
28.   } 
29.   Eval.me(rule) 
30.   println "run successfully" 
31.  } catch (Exception e) { 
32.   e.printStackTrace() 
33.  } 
34. } 
35. } 

В первом я просто хочу проверить правило ввода, чтобы знать, если он правильно на основе наша структура, например, я рассматривал образец правило ниже, чтобы проследить код, если он работает правильно:

switch(@prm43) 
case 12: @msg13 
case 14: @msg32 
default: @msg100 

и работает до линии 26, когда он достигнет линии 26 правило:

switch(1) 
case 
case 
default 

Несмотря на то, что он полностью соответствует шаблону switchRegex, но он не имеет никаких изменений после строки 28, почему?

+1

Не пытайтесь сделать общий разбор с регулярным выражением, используйте анализатор. –

+0

thanx для вашего наконечника – moha

ответ

0

Поскольку я больше разбираюсь в своей проблеме, я тестирую другой синтаксический анализатор, чтобы оценить лучший способ разбора моей грамматики. Во-первых, как рекомендовал loteq, я пошел после изучения jparsec в моем проекте. Но, к сожалению, я не смог найти достаточную информацию и хорошую ссылку на использование этого анализатора. Итак, я ищу еще один синтаксический анализатор, чтобы выполнить свою работу по моей конкретной грамматике, и я нашел antlr4. Затем я разрабатываю свою грамматику и сохраняю ее в файле RuleExpr.g4 для создания файла lexer и parser с помощью antlr. грамматика показано ниже:

grammar RuleExp; 

start 
    : statement+ 
    ; 

statement 
    : assignment 
    | message 
    | ifElseExp 
    | switchExp 
    ; 

ifElseExp 
    : 'if' '(' relCnd ')' 'then' '{' start '}' 
    | 'if' '(' relCnd ')' 'then' '{' start '}' elseExp 
    ; 

elseExp 
    : 'else' ifElseExp 
    | 'else' '{' start '}' 
    ; 

switchExp 
    : 'switch' '(' relCnd ')' caseExp 
    ; 

caseExp 
    : 'case' terminal ':' '{' start '}' caseExp 
    | dfltExpr 
    ; 

dfltExpr 
    : 'default' ':' '{' start '}' 
    ; 

message 
    : '@msg'Digit+ 
    ; 

assignment 
    : id '=' addStmt 
    ; 

relCnd 
    : relCnd '>' logCnd 
    | relCnd '<' logCnd 
    | relCnd '>=' logCnd 
    | relCnd '<=' logCnd 
    | relCnd '==' logCnd 
    | relCnd '!=' logCnd 
    | logCnd 
    ; 

logCnd 
    : logCnd 'AND' termCnd 
    | logCnd 'OR' termCnd 
    | logCnd 'XOR' termCnd 
    | 'NOT' termCnd 
    | termCnd 
    ; 

addStmt 
    : addStmt '+' mulStmt 
    | addStmt '-' mulStmt 
    | mulStmt 
    ; 


mulStmt 
    : mulStmt '*' terminal 
    | mulStmt '/' terminal 
    | mulStmt '^' terminal 
    | terminal 
    ; 

terminal 
    : '('addStmt')' 
    | id 
    | number 
    ; 

termCnd 
    : '('relCnd')' 
    | id 
    | number 
    ; 

id 
    : '@prmt'(Digit)+ 
    | '@fild'(Digit)+ 
    | '@infF'(Digit)+ 
    | '@mthd'(Digit)+ 
    | '@cmpnt'(Digit)+ 
    | '@oprt'(Digit)+ 
    | Letter(Letter|Digit)* 
    ; 

number 
    : Digit+ ('.' Digit+)? 
    ; 

Letter 
    : 'a'..'z' 
    | 'A'..'Z' 
    | '_' 
    ; 

Digit 
    : '0'..'9' 
    ; 

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

После этого я разобрать мой пример кода с помощью лексера и анализатор, который генерируется с помощью Antlr

public void checkSyntax(String rule) { 
     // TODO Auto-generated method stub 
     try { 
     CharStream stream=new ANTLRInputStream(decodeRule(rule)); 
     RuleExpLexer lexer=new RuleExpLexer(stream); 
     CommonTokenStream tokens=new CommonTokenStream(lexer); 
     RuleExpParser parser=new RuleExpParser(tokens); 
     parser.start(); 
     } catch (Exception e) { 
     // TODO: handle exception 
     throw new ApplicationExceptions("uacRule is Wrong"); 
     } 
    } 
2

Прошу прощения за то, что вы не нашли прямой ответ на свой вопрос, но мне кажется немного непонятным, чего вы пытаетесь достичь. Вы меняете правило после того, как выполняете какие-либо замены, но ваш коммутатор не является законным (или, если на то пошло, java). переключатель должен сопровождаться фигурными фигурными скобками. Более того, я бы постарался использовать возможности DSL от groovy вместо создания синтаксического анализатора. Если анализатор действительно то, что вам нужно (отсутствие информации о мотивации и контекста), то я предложил бы использовать комбинатор синтаксического анализа, как jparsec:

https://github.com/jparsec/jparsec

Это очень легко описать грамматик с jparsec, и это очень удобно. В любом случае использование регулярных выражений для этого похоже на проблему, похожую на гвоздь, потому что у нас есть только молоток.

+0

заблаговременно за ваш ответ. На самом деле, я не уверен, что мне действительно нужен парсер. потому что мне просто нужно проверить синтаксис простых правил перед их сохранением. конечно, мне нужно разбирать их в будущем, но только сейчас. в случае, если мне нужен парсер, как то, что вы сказали, можете ли вы порекомендовать мне какой-нибудь полезный учебник для jparsec. – moha

Смежные вопросы