Interpreter pattern

本文介绍了一种简单的解析器设计与实现方法,该方法能够解析特定的字符串表达式,并通过组合模式、访问者模式和迭代器模式等设计模式来处理和解释解析结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Definition


Provides a definition of a macro language or syntax and parsing into objects in a program.

Where to use & benefits

Need your own parser generator.
Translate a specific expression.
Handle a tree-related information.

Related patterns include

Composite, which is an instance in an interpreter.
Flyweight, which shows how to share symbols with abstract context.
Iterator, which is used to traverse the tree structure.
Visitor, which is used to maintain behavior of each note in tree structure.

Example


Given any string expression and a token, filter out the information you want. The below is a simple parser program. the myParser method can be used to parse any expression. The composite, visit and iterator patterns have been used.
import java.util.*;
class Parser{
    private String expression;
    private String token;
    private List result;
    private String interpreted;
   
    public Parser(String e, String t) {
       expression = e;
       token = t;
    }
   
    public void myParser() { 
        StringTokenizer holder = new StringTokenizer(expression, token);
        String[] toBeMatched = new String[holder.countTokens()]; 
        int idx = 0;
        while(holder.hasMoreTokens()) {
            String item = holder.nextToken();
            int start = item.indexOf(",");
            if(start==0) {
               item = item.substring(2);
            }  
        toBeMatched[idx] = item;
        idx ++;
        }
        result = Arrays.asList(toBeMatched);
     }
     public List getParseResult() {
        return result;
     }
     public void interpret() {
         StringBuffer buffer = new StringBuffer();
         ListIterator list = result.listIterator();
         while (list.hasNext()){
            String token = (String)list.next();
            if (token.equals("SFO")){
               token = "San Francisco";         
            }else if(token.equals("CA")) {
               token = "Canada";
            }
            //...
            buffer.append(" " + token);
         }
         interpreted = buffer.toString();       
     }
     public String getInterpretedResult() {
        return interpreted;
     }
     public static void main(String[] args) {
         String source = "dest='SFO',origin='CA',day='MON'";
         String delimiter = "=,'";
         Parser parser = new Parser(source, delimiter);
         parser.myParser();
         parser.interpret();
         String result = parser.getInterpretedResult();
         System.out.println(result);
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值