Разрешение уменьшает/уменьшает конфликт в yacc/ocamlyacc

Я знаю, что это уже давно, но я не был доволен другими ответами, которые я нашел здесь, поэтому я написал это:

me=$(basename $0)

TMP=$(mktemp -d /tmp/$me.XXXXXXXX)
echo 
echo "building new repo in $TMP"
echo
sleep 1

set -e

cd $TMP
mkdir new-repo
cd new-repo
    git init
    cd ..

x=0
while [ -n "$1" ]; do
    repo="$1"; shift
    git clone "$repo"
    dirname=$(basename $repo | sed -e 's/\s/-/g')
    if [[ $dirname =~ ^git:.*\.git$ ]]; then
        dirname=$(echo $dirname | sed s/.git$//)
    fi

    cd $dirname
        git remote rm origin
        git filter-branch --tree-filter \
            "(mkdir -p $dirname; find . -maxdepth 1 ! -name . ! -name .git ! -name $dirname -exec mv {} $dirname/ \;)"
        cd ..

    cd new-repo
        git pull --no-commit ../$dirname
        [ $x -gt 0 ] && git commit -m "merge made by $me"
        cd ..

    x=$(( x + 1 ))
done
10
задан Jay Conrod 23 August 2008 в 19:18
поделиться

1 ответ

К сожалению, единственный ответ я могу придумать средства, увеличивающие сложность грамматики.

  1. разделение expr в simple_expr и expr_with_prefix
  2. позвольте только simple_expr или (expr_with_prefix) в ПРИМЕНЕНИИ

Первый шаг поворачивает Ваш уменьшать/уменьшать конфликт в смещать/уменьшать конфликт, но круглые скобки разрешают это.

Вы собираетесь иметь ту же проблему с 'b c': это a(b(c)) или (a(b))(c)? Необходимо будет также прерваться applied_expression и требуемый (applied_expression) в грамматике.

Я думаю, что это сделает это, но я не уверен:

expr := INT
      | parenthesized_expr
      | expr MINUS expr

parenthesized_expr := ( expr )
                    | ( applied_expr )
                    | ( expr_with_prefix )

applied_expr := expr expr

expr_with_prefix := MINUS expr
8
ответ дан 4 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: